计算 PI (OverflowException)

斯拉文·托伊奇

我写了一个使用无穷级数计算 PI (π) 的方法:

public static decimal NilakanthaGetPI(ulong n)//Nilakantha Series
{
    decimal sum = 0;
    decimal temp = 0;
    decimal a = 2, b = 3, c = 4;
    for (ulong i = 0; i < n; i++)
    {
        temp = 4 / (a * b * c);
        sum += i % 2 == 0 ? temp : -temp;
        a += 2; b += 2; c += 2;
    }
    return 3 + sum;
}

该方法工作正常,直到迭代次数达到几十亿,这给了我一个OverflowException合乎逻辑的值,因为 的值temp大于decimal类型可以容纳的值。我想到使用BigInteger但后来我不能做除法。使用temp = 4 / (a * b * c)这种方法我可以计算 PI 的前 25 位十进制数字(decimal type可以存储 28 或 29 位十进制数字)。有没有办法修改这个方法,以便它可以计算更多的 PI 位数?

埃里克·利珀特

当然,这是您可以使用的技术。

BigInteger sumNumer = 3;
BigInteger sumDenom = 1;
BigInteger a = 2, b = 3, c = 4;
for (BigInteger i = 0; i < n; i++)
{
    BigInteger tempNumer = i % 2 == 0 ? 4 : -4;
    BigInteger tempDenom = (a * b * c);
    sumNumer = sumNumer * tempDenom + sumDenom * tempNumer;
    sumDenom = sumDenom * tempDenom;
    // TODO: reduce sum to a simpler fraction 
    a += 2; 
    b += 2; 
    c += 2;
}

完成循环后,您将得到一个非常接近 pi 的分数的分子和分母。现在的问题是把它变成十进制数字,你可以很容易地通过实现标准的小学长除法算法来做到这一点。

将分数减少到最简单的形式并实现长除法留作练习。尝试一下!它塑造了性格。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章