如何确定pi的计算是否正确?


772

我正在尝试各种方法来实现一个程序,该程序顺序给出pi的数字。我尝试了泰勒级数方法,但是事实证明,它收敛非常慢(当我将我的结果与在线值进行比较之后会比较)。无论如何,我正在尝试更好的算法。

因此,在编写程序时,就像所有算法一样,我陷入了一个问题:我怎么知道n我计算出的数字是准确的?


20
更多的是数学问题。好的算法还可以估计误差。
例如

35
与pi比较?
戴夫牛顿

55
@chris:“实际上无处不在”?
Lightness Races in Orbit 2013年

32
我最多可以为您查询3.141592653589793238462643383279279502,为什么您需要这么多的数字?(这就像原子级精度,且具有宇宙大小的圆。)
AJ Henderson

65
您为什么不只将pi除以并检查结果是否为1?(开个玩笑)
user541686

Answers:


1628

由于我目前是pi位数最多的世界纪录保持者,因此我将加两分

除非您实际上要设置新的世界纪录,否则通常的做法是仅根据已知值验证计算出的数字。这很简单。

实际上,我有一个网页列出了一些数字片段,目的是验证它们的计算结果:http : //www.numberworld.org/digits/Pi/


但是,当您进入世界纪录的领土时,没有什么可比的。

从历史上看,用于验证计算出的数字正确的标准方法是使用第二种算法重新计算数字。因此,如果其中任何一项计算出错,则末尾的数字将不匹配。

这通常需要的时间会增加一倍以上(因为第二种算法通常较慢)。但这是一旦您进入从未计算过的数字和新的世界纪录的未知领域之后,验证已计算数字的唯一方法。


在超级计算机设置记录的年代,通常使用两种不同的AGM算法

这两种O(N log(N)^2)算法都相当容易实现。

但是,如今情况有所不同。在最近的三个世界记录中,我们没有执行两次计算,而是使用最快的已知公式(Chudnovsky公式)仅执行了一次计算:

在此处输入图片说明

该算法难以实现,但比AGM算法要快得多。

然后,我们使用BBP公式验证二进制数字以进行数字提取

在此处输入图片说明

此公式使您可以计算任意二进制数字,而无需先计算所有数字。因此,它用于验证最后几个计算出的二进制数字。因此,它比完整的计算快得多。

这样做的好处是:

  1. 只需要一个昂贵的计算。

缺点是:

  1. 需要实施Bailey-Borwein-Plouffe(BBP)公式。
  2. 需要额外的步骤来验证基数从二进制到十进制的转换。

我已经掩盖了为什么验证最后几位数字意味着所有数字都是正确的一些细节。但是很容易看到这一点,因为任何计算错误都会传播到最后几位。


现在,最后一步(验证转换)实际上非常重要。以前的世界纪录保持者之一实际上是在呼吁我们这样做,因为起初,我没有对其进行充分的描述。

因此,我从我的博客中提取了以下代码段:

N = # of decimal digits desired
p = 64-bit prime number

在此处输入图片说明

使用以10为底的算术计算A,使用二进制算术计算B。

在此处输入图片说明

如果为A = B,则“概率很高”,则转换正确。


有关更多阅读,请参阅我的博客文章Pi-5万亿位数


15
并回答另一个有关如何知道特定算法何时收敛到N位数字的问题:这要求您知道算法的收敛行为。的泰勒级数ArcTan(1)是对数收敛的。因此,您需要大量的项来收敛-简而言之,不要使用它。
Mysticial 2013年

21
是的,Chudnovsky的公式每学期收敛于稳定的14.18位数字。因此,您可以将总数除以该位数,以获得所需的术语数。(精确值:Log(151931373056000)/Log(10) = 14.181647462725477655...
Mysticial

7
@ erikb85 Kinda。BBP公式(在某种程度上)算作第二种算法。但是仅凭它本身是不够的,因为它不能验证转换为基数为10的情况。使用BBP +转换检查来消除第二次计算的需求并不是我的想法。这是由Fabrice Bellard在他的2009年世界纪录中首次完成的。这是一个好主意,我们做了同样的事情,并在此基础上进行了改进。
Mysticial 2013年

83
@FunsukWangadu我只能为自己说话,但事实就是如此:我从不真正关心Pi本身。对我来说,这只是另一个数字。该值不是数字本身或无用的数字的10万亿字节,它的方法是用来实现这一目标。数个世纪的数学以及数十年来促成这一壮举的计算机/程序研究在其他许多领域同样适用,因此比数字硬盘更具价值。简而言之:计算Pi的位数更是一项运动。
Mysticial

8
@Mystical,刚从另一个stackoverflow问题跌落到您的Pi计算站点上,不由自主地大笑着。喜欢日志中的硬盘故障/地震:)真是太神奇了!
2013年

48

毫无疑问,出于您的目的(我认为这只是编程工作),最好的办法是对照网络上pi位数的任何列表检查结果。

我们怎么知道这些值是正确的?好吧,我可以说有一些计算机科学的方法来证明算法的实现是正确的。

更加务实的是,如果不同的人使用不同的算法,并且他们都同意(选择一个数字)一千(百万,无论是多少个)小数位,那应该给您一种温暖的模糊感觉,使他们感到正确。

从历史上看,威廉·尚克斯(William Shanks)在1873年将pi发布到707个小数位。可怜的家伙,他从第528个小数位开始犯了一个错误。

非常有趣的是,在1995 年发布一种算法该算法具有直接计算pi的第n个数字(以16为底)而不必计算所有先前的数字的属性!

最后,我希望您的初始算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...最简单的编程方法,但是它也是最慢的方法之一。请查看Wikipedia上的pi文章,以获取更快的方法。


7
最后一个公式(Leibniz公式,iirc)实际上交替了加法和减法。
2013年

21

您可以使用多种方法,看看它们是否收敛于相同的答案。或从网上获取一些。Chudnovsky算法通常用作计算pi的非常快速的方法。http://www.craig-wood.com/nick/articles/pi-chudnovsky/


减少了机会,但是我仍然不确定采用多方法解决方案,如果两种方法都不对怎么办。在线检查不能保持有效性,那么为什么不从网络本身取走价值呢?我在考虑bbp哪个更合适?
Ishan Sharma

7
@IshanSharma如果这两种算法是独立的,则两种计算均得出错误结果的可能性几乎为零。如果任何一种计算都出了问题,则最终结果将不匹配-因此您至少知道其中之一是错误的。
Mysticial

15

泰勒级数是近似pi的一种方法。如前所述,它收敛缓慢。

泰勒级数的部分和可以显示为与pi的真值相距在下一项的乘数内。

近似pi的其他方法具有类似的方法来计算最大误差。

我们知道这一点是因为我们可以用数学方法证明它。


第二。我认为这里的大多数答案只是在数学证明的概念上没有给予足够的重视。无论您的程序用于计算pi的数字是什么,它都比最有说服力的数学证明(您的程序的方法确实可以计算pi)更具说服力。这表明对pi计算pi的程序存在不同的约束:它们应该以性能和正确性为目标,尽可能地提高可理解性。
路易斯·卡西利亚斯

5

您可以尝试使用(相当)快速收敛的正弦和余弦幂级数进行计算sin(pi/2)(或cos(pi/2)就此而言)。(甚至更好:使用各种加倍公式来计算更接近的值,x=0以加快收敛速度​​。)

顺便说一句,比起使用序列而言,更好tan(x),用cos(x)一个黑匣子计算(例如,您可以使用上述的taylor序列)是通过牛顿进行寻根。当然那里有更好的算法,但是如果您不想验证大量的数字,这就足够了(并且实现起来并不是那么棘手,并且您只需要一点微积分就可以理解它的工作原理。)


6
我不太清楚这将如何帮助发现第1000个数字减1。您需要非常精确的值,对sin(pi/2)吗?
Matthieu M.

除非是开玩笑之类的,否则我不确定要说些什么。sin(pi / 2)= 1 cos(pi / 2)= 0因此,我想说肯定会收敛的很快。
BentFranklin

15
我想这不是有目共睹的,在评价sin(x)cos(x)对精度高,其实很多不是计算丕本身更加困难。
Mysticial

2
出于明显的原因,您不应为此使用sin(pi / 2)。最好改用sin(pi / 6)并确保它精确地等于1/2。
罗伯特·洛兹尼亚克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.