提问人:Jacob Sharf 提问时间:12/29/2012 更新时间:12/29/2012 访问量:307
Chudnovsky 算法生成 -nan
Chudnovsky algorithm produces -nan
问:
我正在尝试实现用于计算 pi 的 Chudnovsky 算法。
这是我的实现:
int fact(int n)
{
if(n<=1)
return 1;
else
return fact(n-1)*n;
}
double calcPi(long n)
{
double z=0;
for(int k=0; k<n; k++)
{
z+=(pow(-1, k)*fact(6*k)*(13591409 + 545140134.0*k))/(fact(3*k)*pow(fact(k), 3)*pow(640320.0, 3.0*k+3.0/2));
}
z*=12;
return 1/z;
}
不过,我遇到了一个小错误。当我插入大于 12 的 N 值时,我得到 -nan。我猜这与有限的精度、某种整数溢出或我绝对糟糕的阶乘实现有关(是的,我很懒惰并使用递归。现在是凌晨 2 点)。
无论如何,如果您以前经历过这种情况并且可以提出快速修复建议,那就太好了。
也许我应该只使用 Python,不要再担心溢出了。
新年快乐!
答:
3赞
user1824407
12/29/2012
#1
浮点运算 这不是微不足道的,考虑到您的问题,我更愿意用一些技巧来回答您的问题。
您可以使用诸如 GMP 或 MPFR 之类的库来解决这个问题,这对两者来说都是一个很好的常见问题解答。
如果你真的想掌握这一点,在几乎所有主要的编程语言上,你绝对应该从阅读IEEE 754开始。
评论
0赞
Jacob Sharf
12/29/2012
是的,我已经读过很多遍 IEEE 754(这是我本季度的第一次期中考试)。当时只是凌晨 2 点(现在是凌晨 3 点),我没有正确思考。我的猜测是主要问题是阶乘函数的溢出,而不是浮点精度问题。无论哪种方式,解决方案都是实施GMP或MPFR。
评论
14!
(或接近于此)溢出 32 位 int。 会很快溢出。fact(6*k)
unsigned long long