Chudnovsky 算法生成 -nan

Chudnovsky algorithm produces -nan

提问人:Jacob Sharf 提问时间:12/29/2012 更新时间:12/29/2012 访问量:307

问:

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

新年快乐!

c 数学 pi 浮点精度

评论

0赞 user1824407 12/29/2012
为什么?Python只是为无限数字提供了无限的空间?您的问题可能会在所有最常用的语言及其他语言之间共享。
0赞 Mat 12/29/2012
14!(或接近于此)溢出 32 位 int。 会很快溢出。fact(6*k)
0赞 12/29/2012
@user1824407 “为什么?python 只是为无限数字提供了无限的空间?“——现在到底是谁在谈论 Python?这是 C,它甚至不接近 Python......
0赞 12/29/2012
如果你到处使用,你确实可以走得更远,但你需要稍微优化你的算法,以便获得更大范围的有效输入值。unsigned long long
1赞 user1824407 12/29/2012
@JacobSharf,由于 python 是一种解释型语言,它依赖于一个名为 interpreter 的软件,它是 python 解释器的标准实现,它被称为 Cpython,它基本上是 linux 发行版或 python 安装程序附带的 python intepreter。您可以在官方 wiki 上找到有关 cpython 的详细信息 docs.python.org/2/tutorial/floatingpoint.html 。在 python 中讨论这个问题时,您需要为解释器提供参考实现,如果您不使用 Cpython,请参阅您选择的解释器的 wiki。

答:

3赞 user1824407 12/29/2012 #1

浮点运算 这不是微不足道的,考虑到您的问题,我更愿意用一些技巧来回答您的问题。

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

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

评论

0赞 Jacob Sharf 12/29/2012
是的,我已经读过很多遍 IEEE 754(这是我本季度的第一次期中考试)。当时只是凌晨 2 点(现在是凌晨 3 点),我没有正确思考。我的猜测是主要问题是阶乘函数的溢出,而不是浮点精度问题。无论哪种方式,解决方案都是实施GMP或MPFR。