我写了一个使用无穷级数计算 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] 删除。
我来说两句