如何在 C 中计算欧拉的 37 位小数?
2 128约为 3.4*10 38。通过形成一个 128 位整数分子/分母,我们可以实现所需的e。
如下重写循环并运行到足够大n
直到num*i + 1
即将溢出(n = = 33),我们可以达到/接近所需的结果。
// Algorithm
wide_floating_point e() {
unsigned n = 33;
my_uint128 num = 1;
my_uint128 den = 1;
for (unsigned i=1; i <= n; i++) {
num = num*i + 1;
den = den*i;
}
return (wide_floating_point) num/fact;
}
现在 OP,可能没有 128 无符号整数类型,也无法执行 128/128 位浮点除法。然而 OP 只需要创建 2 个函数(未显示实现 - 但本质上是小学数学):
typedef struct {
// or unsigned char decimal_digit[40] or
// however you want to save a big integer
uint64_t hi,lo;
} my_uint128;
my_uint128 times_add_128(my_uint128 x, unsigned m, bool a);
void print_quotient_128(my_uint128 num, my_uint128 dem);
如果我们测试算法并使用__int128
并使用 a long double
(精度为 80),我们将接近目标。
long double e(int n) {
unsigned __int128 fact = 1;
unsigned __int128 num = 1;
for (int i=1; i<=n; i++) {
fact *= i;
if (num > (((unsigned __int128)-1)-1)/i) { printf("%d!\n", i); exit(0); }
num = num*i + 1;
}
return 1.0L*num/fact;
}
int main() {
for (int i=1; i<34; i++) {
printf("%d %.25Lf\n", i, e(i));
}
}
2,718281828459045235 3602874713526624977
33 2.718281828459045235 4281681
我将 OP 的 2 个函数留给times_add_128(), print_quotient_128()
编码: