如何确定我的 pi 计算是不是准确?
Posted
技术标签:
【中文标题】如何确定我的 pi 计算是不是准确?【英文标题】:How do I determine whether my calculation of pi is accurate?如何确定我的 pi 计算是否准确? 【发布时间】:2012-12-26 08:04:45 【问题描述】:我正在尝试各种方法来实现一个按顺序给出 pi 数字的程序。我尝试了Taylor series 方法,但事实证明收敛速度非常慢(一段时间后我将我的结果与在线值进行比较时)。无论如何,我正在尝试更好的算法。
所以,在编写程序时,我遇到了一个问题,就像所有算法一样:我怎么知道我计算的 n
数字是准确的?
【问题讨论】:
更多的数学问题。好的算法还可以估计误差。 与 pi 比较? @chris: "字面上无处不在"? 我可以帮你查到3.141592653589793238462643383279502,除此之外,你为什么需要这么多的数字? (这有点像原子级别的精度,有一个宇宙大小的圆圈。) 为什么不直接除以 pi 并检查结果是否为 1? (开个玩笑) 【参考方案1】:由于我是目前 pi 位数最多的世界纪录保持者,我将添加我的two cents:
除非您实际上是在创造新的世界纪录,否则通常的做法是根据已知值验证计算出的数字。所以这很简单。
事实上,我有一个网页列出了数字的 sn-ps 以验证针对它们的计算:http://www.numberworld.org/digits/Pi/
但是当你进入世界纪录领域时,没有什么可以比较的。
从历史上看,验证计算数字是否正确的标准方法是使用第二种算法重新计算数字。因此,如果任一计算出错,最后的数字将不匹配。
这通常是所需时间的两倍多(因为第二种算法通常较慢)。但这是验证计算数字的唯一方法,一旦您进入了从未计算过的数字和新世界纪录的未知领域。
在超级计算机创造记录的时代,通常使用两个不同的AGM algorithms:
Gauss–Legendre algorithm Borwein's algorithm这两个O(N log(N)^2)
算法都相当容易实现。
然而,如今,情况有些不同了。在最近的三项世界纪录中,我们没有执行两次计算,而是使用已知最快的公式(Chudnovsky Formula)仅执行了一次计算:
这种算法实现起来要困难得多,但比 AGM 算法快很多。
然后我们使用BBP formulas for digit extraction 验证二进制数字。
这个公式允许您计算任意二进制数字而不计算它之前的所有数字。所以它用于验证最后几个计算的二进制数字。因此它比完整计算快得多。
这样做的好处是:
-
只需要一次昂贵的计算。
缺点是:
-
需要实现Bailey–Borwein–Plouffe (BBP) 公式。
需要一个额外的步骤来验证从二进制到十进制的基数转换。
我已经掩盖了为什么验证最后几位数字意味着所有数字都是正确的一些细节。但是很容易看出这一点,因为任何计算错误都会传播到最后一位。
现在这最后一步(验证转换)实际上相当重要。之前的世界纪录保持者之一实际上已经把我们叫出来了,因为一开始我没有充分描述它是如何工作的。
所以我从我的博客中提取了这个 sn-p:
N = # of decimal digits desired
p = 64-bit prime number
使用以 10 为底的算术计算 A,使用二进制算术计算 B。
如果A = B
,那么以“极高的概率”,转换是正确的。
如需进一步阅读,请参阅我的博文Pi - 5 Trillion Digits。
【讨论】:
并回答另一个关于如何知道特定算法何时收敛到 N 位的问题:这需要您知道算法的收敛行为。ArcTan(1)
的泰勒级数呈对数收敛。所以你需要大量的术语来收敛——简而言之,不要使用它。
是的,Chudnovsky 的公式收敛于稳定的每项 14.18 位数。因此,您可以将总位数除以得到您需要的术语数。 (准确值为:Log(151931373056000)/Log(10) = 14.181647462725477655...
)
@erikb85 有点。 BBP 公式(在某种程度上)算作第二种算法。但仅靠它本身是不够的,因为它不验证转换为基数 10。使用 BBP + 转换检查来消除对第二次计算的需要的想法不是我的。这是法布里斯·贝拉德在 2009 年的世界纪录中首次完成的。这是一个好主意,我们做了同样的事情并对其进行了改进。
@FunsukWangadu 我只能为自己说话,但事实就是这样:我从来没有真正关心过 Pi 本身。对我来说,这只是另一个数字。该值不在数字本身或 10 TB 无用数字中,而是用于实现它的 方法。数百年的数学,以及促成这一壮举的数十年的计算机/编程研究适用于许多其他领域,因此比数字硬盘更有价值。简而言之:计算 Pi 的位数更像是一项运动。
@Mystical,刚刚从另一个*** question 偶然发现了你的 Pi 计算网站,不禁对你们所做的事情傻笑。喜欢日志中的硬盘故障/地震 :) 太棒了!【参考方案2】:
毫无疑问,出于您的目的(我假设这只是一个编程练习),最好的办法是对照网络上的任何 pi 数字列表检查您的结果。
我们如何知道这些值是正确的?好吧,我可以说有计算机科学的方法来证明算法的实现是正确的。
更务实的是,如果不同的人使用不同的算法,并且他们都同意(选择一个数字)一千(百万,等等)小数位,那应该会给你一种温暖的模糊感觉,他们做对了。
从历史上看,William Shanks 在 1873 年将 pi 发布到小数点后 707 位。可怜的家伙,他从小数点后 528 位开始犯了一个错误。
非常有趣的是,在 1995 年 an algorithm was published 具有可以直接计算 pi 的第 n 位(以 16 为底)的属性无需计算所有前面的数字!
最后,我希望你的初始算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
这可能是最简单的编程方式,但也是最慢的方式之一。查看the pi article on Wikipedia 以获得更快的方法。
【讨论】:
最后一个公式(莱布尼茨公式,iirc)实际上交替加减。【参考方案3】:您可以使用多种方法,看看它们是否会收敛到相同的答案。或者从网上抢一些。 Chudnovsky 算法通常用作计算 pi 的一种非常快速的方法。 http://www.craig-wood.com/nick/articles/pi-chudnovsky/
【讨论】:
减少了机会,但我仍然不能确定多种方法的解决方案,如果两者都错了怎么办。在网络上检查并不有效,那么为什么不从网络本身中取出值。我在想bbp哪个更适合? @IshanSharma 如果这两种算法是独立的,那么两种计算错误并得到相同结果的可能性几乎为零。如果任一计算出现问题,最终结果将不匹配 - 因此您知道其中至少有一个是错误的。【参考方案4】:泰勒级数是近似 pi 的一种方法。如前所述,它收敛缓慢。
泰勒级数的部分和可以显示在下一项的某个乘数内,远离 pi 的真实值。
其他近似 pi 的方法也有类似的方法来计算最大误差。
我们知道这一点,因为我们可以用数学方法证明它。
【讨论】:
第二。我认为这里的大多数答案都没有对 数学证明 的概念给予足够的重视。无论您的程序用于计算 pi 的位数,它都不会比最有说服力的数学证明更令人信服,即您的程序的方法确实可以计算 pi。这表明对 pi 计算 pi 的程序有不同的约束:它们应该以可理解性为目标,以实现性能和正确性。【参考方案5】:您可以尝试使用(相当)快速收敛的 sin 和 cos 幂级数来计算 sin(pi/2)
(或 cos(pi/2)
)。 (更好的是:使用各种加倍公式计算更接近的x=0
以加快收敛速度。)
顺便说一句,比为tan(x)
使用系列更好的是,将cos(x)
计算为一个黑盒(例如,您可以使用上面的泰勒级数)通过牛顿进行根查找。当然有更好的算法,但如果你不想验证大量的数字,这应该就足够了(而且实现起来并不那么棘手,你只需要一点微积分就可以理解它为什么起作用。)
【讨论】:
我不太明白它如何帮助发现第 1000 位数字减 1。您需要非常精确的sin(pi/2)
值,不是吗?
我不知道对上一个答案该说什么,除非是玩笑什么的。 sin(pi/2) = 1 cos(pi/2) = 0 所以,我会说那些肯定收敛得很快。
我想并不是每个人都清楚,以高精度评估 sin(x)
和 cos(x)
实际上比计算 Pi 本身要困难得多。
出于显而易见的原因,您不应为此使用 sin(pi/2)。最好改用 sin(pi/6) 并确保它正好是 1/2。【参考方案6】:
有一个arctan digit-wise评估算法,只是为了回答这个问题,pi = 4 arctan 1 :)
【讨论】:
有人对此投了反对票,可能不理解“pi的数字顺序”任务。以上是关于如何确定我的 pi 计算是不是准确?的主要内容,如果未能解决你的问题,请参考以下文章