1

我正在尝试实现用于计算 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,而不必担心溢出。

(几乎)新年快乐!

4

1 回答 1

3

浮点算术这不是微不足道的,考虑到你的问题,我更喜欢用一些技巧来回答你的问题。

您可以使用诸如GMPMPFR之类的库来解决此问题,这对两者来说都是一个很好的常见问题解答

如果你真的想掌握这一点,在几乎所有主要的编程语言上,你绝对应该从阅读 IEEE 754 开始。

于 2012-12-29T10:32:35.283 回答