如何确定我对 pi 的计算是否准确?

How do I determine whether my calculation of pi is accurate?

提问人:Ishan Sharma 提问时间:1/12/2013 最后编辑:Peter MortensenIshan Sharma 更新时间:11/21/2021 访问量:124452

问:

我正在尝试各种方法来实现一个按顺序给出圆周率数字的程序。我尝试了泰勒级数方法,但事实证明收敛速度非常慢(一段时间后,当我将我的结果与在线值进行比较时)。无论如何,我正在尝试更好的算法。

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

算法 数学 语言 不可知 PI

评论

23赞 example 1/12/2013
更像是一个数学问题。好的算法还可以估计误差。
38赞 Dave Newton 1/12/2013
与圆周率相比?
55赞 Lightness Races in Orbit 1/12/2013
@chris:“几乎无处不在”?
33赞 AJ Henderson 1/12/2013
我可以为您检查多达 3.141592653589793238462643383279502,除此之外,为什么需要这么多数字?(这有点像宇宙大小的圆圈的原子级精度。
69赞 user541686 1/18/2013
为什么不除以圆周率并检查结果是否为 1?(开个玩笑)

答:

21赞 argentage 1/12/2013 #1

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

评论

0赞 Ishan Sharma 1/12/2013
减少了机会,但我仍然无法确定使用多种方法解决方案,如果两者都错了怎么办。在网络上检查不成立,那么为什么不从网络上取值呢?我在想bbp哪一个更合适?
8赞 Mysticial 1/12/2013
@IshanSharma 如果这两种算法是独立的,那么两种计算结果相同时出错的可能性几乎为零。如果在任何一个计算中出现任何问题,最终结果将不匹配 - 因此您知道其中至少有一个是错误的。
15赞 Yakk - Adam Nevraumont 1/12/2013 #2

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

泰勒级数的部分和可以证明在下一项的某个乘数内,远离 pi 的真实值。

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

我们知道这一点,因为我们可以通过数学来证明它。

评论

2赞 Luis Casillas 1/15/2013
借调。我认为这里的大多数答案只是没有对数学证明的概念给予足够的重视。无论你的程序是用来计算圆周率的位数的,它永远不会比最有说服力的数学证明更有说服力,证明你的程序的方法确实计算了圆周率。这表明对 pi 计算 pi 的程序有一个不同的限制:它们应该以可理解性为目标,以及性能和正确性。
1661赞 Mysticial 1/12/2013 #3

由于我是目前圆周率位数最多的世界纪录保持者,我将添加我的两美分

除非您真的要创造新的世界纪录,否则通常的做法只是根据已知值验证计算出的数字。所以这很简单。

事实上,我有一个网页,其中列出了数字片段,用于验证对它们的计算:http://www.numberworld.org/digits/Pi/


但是,当你进入世界纪录的领域时,没有什么可以比较的。

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

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


在超级计算机创造记录的时代,通常使用两种不同的 AGM 算法

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

然而,如今,情况有点不同。在最后三项世界纪录中,我们没有执行两次计算,而是只使用已知最快的公式(Chudnovsky 公式)执行了一次计算:

Enter image description here

这种算法更难实现,但它比 AGM 算法快得多。

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

Enter image description here

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

这样做的好处是:

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

缺点是:

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

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


现在,最后一步(验证转换)实际上相当重要。一位以前的世界纪录保持者实际上向我们提出了这个问题,因为最初,我没有充分描述它是如何工作的。

所以我从我的博客中提取了这个片段:

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

Enter image description here

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

Enter image description here

如果 ,则以“极高概率”,转换是正确的。A = B


如需进一步阅读,请参阅我的博客文章 Pi - 5 Trillion Digits

评论

16赞 Mysticial 1/12/2013
为了回答另一个问题,即如何知道特定算法何时收敛到 N 位:这需要您知道算法的收敛行为。泰勒级数是对数收敛的。因此,您需要指数级的大量术语才能收敛 - 简而言之,不要使用它。ArcTan(1)
23赞 Mysticial 1/12/2013
是的,Chudnovsky 的公式收敛为每项 14.18 位数字。因此,您可以将总位数除以该位数,以获得所需的术语数。(确切值为:Log(151931373056000)/Log(10) = 14.181647462725477655...)
7赞 Mysticial 1/14/2013
@erikb85金达。BBP 公式(在某种程度上)算作第二种算法。但仅靠它本身是不够的,因为它没有验证到基数 10 的转换。使用 BBP + 转换检查来消除第二次计算的需要的想法不是我的。这是法布里斯·贝拉德(Fabrice Bellard)在2009年创造世界纪录时首次完成的。这是一个好主意,我们做了同样的事情并对其进行了改进。
86赞 Mysticial 5/4/2013
@FunsukWangadu我只能为自己说话,但事实是:我从来没有真正关心过Pi本身。对我来说,这只是另一个数字。该值不在于数字本身或 10 TB 的无用数字,而在于用于实现它的方法。几个世纪的数学,以及几十年的计算机/编程研究,为这一壮举做出了贡献,适用于许多其他领域,因此比数字硬盘更有价值。简单地说:计算圆周率的数字更像是一项运动。
8赞 Joe 11/28/2013
@Mystical,刚刚从另一个 stackoverflow 问题中偶然发现了你的 Pi 计算站点,忍不住对你们的所作所为目瞪口呆。喜欢日志中的硬盘故障/地震:)简直太棒了!
50赞 Larry Smith 1/12/2013 #4

毫无疑问,出于您的目的(我认为这只是一个编程练习),最好的办法是将您的结果与网络上任何 pi 数字列表进行检查。

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

更实际地说,如果不同的人使用不同的算法,并且他们都同意(选择一个数字)一千(百万,无论什么)小数位,那应该会给你一种温暖的模糊感觉,他们做对了。

从历史上看,威廉·香克斯(William Shanks)在1873年将圆周率公布为小数点后707位。可怜的家伙,他从小数点后第 528 位开始犯了一个错误。

非常有趣的是,在 1995 年发布了一种算法,该算法具有直接计算 pi 的第 n 位(以 16 为基数)的属性,而无需计算所有先前的数字

最后,我希望你最初的算法不是 这可能是最简单的编程方法,但它也是最慢的方法之一。查看维基百科上的 pi 文章以获取更快的方法。pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...

评论

7赞 Thomas 1/12/2013
最后一个公式(莱布尼茨公式,iirc)实际上是加法和减法的交替。
5赞 user1974703 1/14/2013 #5

你可以尝试使用(相当)快速收敛的幂级数来计算(或就此而言)sin 和 cos.(更好的是:使用各种倍增公式来计算更接近,以加快收敛。sin(pi/2)cos(pi/2)x=0

顺便说一句,比使用级数更好,计算说是一个黑匣子(例如,你可以使用上面的泰勒级数)是通过牛顿进行根查找。当然有更好的算法,但如果你不想验证大量的数字,这应该就足够了(而且实现起来并不难,你只需要一点微积分就可以理解它为什么有效。tan(x)cos(x)

评论

7赞 Matthieu M. 1/14/2013
我不太明白它如何帮助发现第 1000 位数字偏离 1。你需要非常精确的值,不是吗?sin(pi/2)
0赞 BentFranklin 1/20/2013
我不知道该怎么说前面的答案,除非是开玩笑什么的。sin(pi/2) = 1 cos(pi/2) = 0 所以,我想说的是,那些肯定会很快收敛。
17赞 Mysticial 1/20/2013
我想并不是每个人都清楚,评估和高精度实际上比计算 Pi 本身要困难得多sin(x)cos(x)
2赞 Robert Lozyniak 12/20/2016
出于显而易见的原因,您不应该为此使用 sin(pi/2)。最好改用 sin(pi/6) 并确保它正好是 1/2。
1赞 Sam Ginrich 3/20/2021 #6

有一种算法可以对arctan进行数字计算,只是为了回答这个问题,pi = 4 arctan 1 :)

评论

0赞 Sam Ginrich 3/25/2021
有人对此投了反对票,可能不理解“按顺序排列圆周率的数字”这项任务。