am1x icon

sumgammaadd002

am1x | PRO | 02/03/22 04:12:39 PM UTC | 0 ⭐ | 624 👁️ | Never ⏰ | []
text |

1.41 KB

|

None

|

0 👍

/

0 👎

#include <quadmath.h>
#include <stdio.h>
#include <assert.h>
#include <inttypes.h>
#include <math.h>
#include <vector>
  typedef __float128 real;
  template <typename T> struct Adder {
	std::vector<T> v;
 	void reset() {
		v.clear();
		v.push_back(0);
	}
 	Adder() { reset(); }
 	T sum() const {
		T res = v[0];
		size_t l = v.size();
		for (size_t i = 1; i < l; i++)
			res += v[i];
		return res;
	}
 	void operator+= (T x) {
		size_t i = 0;
		for (i = 0; v[i]; i++) {
			x += v[i];
			v[i] = 0;
		}
		v[i] = x;
		if (i + 1 == v.size())
			v.push_back(0);
	}
 };
  int main()
{
	uint64_t n = 100000000;
	Adder<real> a;
	for (uint64_t i = 2; i <= n; i++) {
		real x = i;
		real y = expm1q(logq(x) / x) / x;
		a += y;
	}
	real s = a.sum();
 	{
		real x = n + 0.5q;
		real lx = logq(x);
		real y1 = (lx + 1) / x;
		real y2 = (2 * lx * (lx + 1) + 1) / (2 * 4 * x * x);
		real y3 = (((9 * lx + 9) * lx + 6) * lx + 2) / (6 * 27 * x * x * x);
		real y4 = ((((32 * lx + 32) * lx + 24) * lx + 12) * lx + 3) / (24 * 128 * (x * x) * (x * x));
		real y5 = (((((625 * lx + 625) * lx + 500) * lx + 300) * lx + 120) * lx + 24) / (120 * 3125 * x * (x * x) * (x * x));
		real xrx = expm1q(lx / x);
		real yd = (x * xrx + (xrx + 1) * (lx - 1)) / (24 * x * x * x);
		s += y1;
		s += y2;
		s += y3;
		s += y4;
		s += y5;
		s -= yd;
	}
 	printf("n=%lu, %.36Qf\n", n, s);
	return 0;
}
  

Comments