我一直在尝试各种方法来实现一个按顺序给出π的各个数字的程序。我试过泰勒级数法,但它收敛得非常慢(当我将我的计算结果与网上的值进行比较后)。不管怎样,我正在尝试更好的算法。
因此,在编写程序时,我遇到了一个问题,就像所有算法一样:我如何知道我计算出的前n
位数字是准确的?
我一直在尝试各种方法来实现一个按顺序给出π的各个数字的程序。我试过泰勒级数法,但它收敛得非常慢(当我将我的计算结果与网上的值进行比较后)。不管怎样,我正在尝试更好的算法。
因此,在编写程序时,我遇到了一个问题,就像所有算法一样:我如何知道我计算出的前n
位数字是准确的?
作为当前最多圆周率位数的世界纪录保持者,我想要发表一下我的个人观点:
除非你真的在打破世界纪录,通常的做法就是将计算出来的数字与已知值进行验证。所以这很简单。
实际上,我有一个网页,列出了一些圆周率位数的片段,用于验证计算结果:http://www.numberworld.org/digits/Pi/
在超级计算机创造记录的时代,通常使用两种不同的AGM算法:
这两种算法都是O(N log(N)^2)
算法,实现起来相对容易。
然而,现在情况有所不同。在过去三次世界纪录中,我们没有执行两次计算,而是使用已知最快公式(Chudnovsky公式)只进行了一次计算:
这个算法难以实现,但比AGM算法快得多。N = # of decimal digits desired
p = 64-bit prime number
使用十进制算法计算A,使用二进制算法计算B。
如果A = B
,那么 "极高的概率" 下,转换是正确的。
如需进一步阅读,请查看我的博客文章圆周率- 5万亿位数。
Log(151931373056000)/Log(10) = 14.181647462725477655...
) - Mysticial毫无疑问,对于您的目的(我假设这只是一个编程练习),最好的方法是与网络上任何一个圆周率数字清单进行比较检查结果。
那我们如何知道这些值是正确的呢?嗯,我可以说,有计算机科学的方法来证明算法实现是正确的。
更实际地说,如果不同的人使用不同的算法,并且他们都同意到(选一个数字)一千(一百万,任何一个)小数位,这应该让你感觉很舒服,他们得到了正确答案。
历史上,William Shanks在1873年将pi推算到707位小数。可怜的家伙,在第528个小数位就出错了。
非常有趣的是,在1995年发表了一篇算法,它具有直接计算pi的第n位(以16进制为基数)而无需计算所有先前数字的属性!
最后,我希望您的初始算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
。虽然这可能是最简单的编程方法,但也是最慢的方法之一。请参阅维基百科上关于圆周率更快的方法。
您可以采用多种方法来查看它们是否收敛到相同的答案。或者从网络上获取一些方法。 Chudnovsky算法通常用作计算π的非常快速的方法。
http://www.craig-wood.com/nick/articles/pi-chudnovsky/Taylor级数是近似π的一种方法。如注所述,它收敛缓慢。
Taylor级数的部分和可被证明在某个倍数范围内接近π的真实值,与下一个项之间的误差也相应较小。
其他求近似π的方法也有类似的计算最大误差的方式。
我们之所以知道这个,是因为我们可以在数学上证明它。
sin(x)
和cos(x)
比计算π本身要困难得多。 - Mysticial有一种算法可以逐位计算arctan,只是为了回答这个问题,pi = 4 arctan 1 :)