Chudnovsky算法产生-nan

时间:2012-12-29 10:20:40

标签: c math precision pi floating-point-precision

我正在尝试实施Chudnovsky algorithm来计算pi。

这是我的实施:

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,并且不要担心溢出。

快乐(差不多)新年!

1 个答案:

答案 0 :(得分:3)

浮点算术它不是微不足道的,考虑到你的问题,我更愿意回答你的问题。

您可以使用GMPMPFR等库来解决此问题,这是a good FAQ for both

如果您真的想掌握这一点,几乎在所有主流编程语言中,您都应该从阅读IEEE 754开始。