我正在尝试各种方法来实现一个按顺序给出pi数字的程序。我尝试了泰勒级数方法,但事实证明它收敛得非常慢(一段时间后我将结果与在线值进行比较)。无论如何,我正在尝试更好的算法。
因此,在编写程序时,我遇到了一个问题,就像所有算法一样:我如何知道我计算的n数字是准确的?
n
您可以使用多种方法,看看它们是否收敛到相同的答案。或者从网上抓取一些。Chudnovsky算法通常用作计算pi的非常快速的方法。http://www.craig-wood.com/nick/articles/pi-chudnovsky/
泰勒级数是近似π的一种方法。如前所述,它收敛缓慢。
泰勒级数的部分和可以被证明在下一项的乘数范围内,远离π的真实值。
其他近似pi的方法也有类似的方法来计算最大误差。
我们知道这一点,因为我们可以用数学来证明它。
由于我是目前pi位数最多的世界纪录保持者,我将添加我的两分钱:
除非你真的创造了一个新的世界纪录,通常的做法只是将计算的数字与已知值进行验证。所以这很简单。
事实上,我有一个网页列出了数字片段,用于验证对它们的计算:http://www.numberworld.org/digits/Pi/
但是当你进入世界纪录领域时,没有什么可以比较的。
从历史上看,验证计算数字正确的标准方法是使用第二种算法重新计算数字。因此,如果任一计算出错,末尾的数字将不匹配。
这通常会使所需时间增加一倍以上(因为第二种算法通常较慢),但一旦你进入从未计算过的数字的未知领域并创造新的世界纪录,这是验证计算数字的唯一方法。
在超级计算机创造记录的日子里,通常使用两种不同的AGM算法:
这些都是非常容易实现的O(N log(N)^2)算法。
O(N log(N)^2)
然而,现在情况有点不同了。在过去的三项世界纪录中,我们没有执行两次计算,而是使用已知最快的公式(丘德诺夫斯基公式)只执行了一次计算:
这种算法更难实现,但比年度股东大会算法快得多。
然后我们使用数字抽取的BBP公式验证二进制数字。
此公式允许您计算任意二进制数字没有计算它之前的所有数字。因此,它用于验证最后几个计算的二进制数字。因此,它比完整计算快很多。
这样做的好处是:
缺点是:
我已经掩盖了为什么验证最后几位数字意味着所有数字都是正确的一些细节。但这很容易看出,因为任何计算错误都会传播到最后一位数字。
最后一步(验证转换)实际上相当重要。以前的世界纪录保持者之一在这方面排名第0,因为最初,我没有充分描述它是如何工作的。
所以我从我的博客中提取了这个片段:
N = # of decimal digits desiredp = 64-bit prime number
使用基数10算术计算A,使用二进制算术计算B。
如果A = B,则具有“极高的概率”,则转换是正确的。
A = B
进一步阅读,请参阅我的博客文章Pi-5万亿位。
毫无疑问,为了您的目的(我假设这只是一个编程练习),最好的办法是将您的结果与网络上的任何pi数字列表进行检查。
我们如何知道这些值是正确的?我可以说,有计算机科学的方法来证明算法的实现是正确的。
更实用地说,如果不同的人使用不同的算法,他们都同意(选择一个数字)一千(百万,无论什么)小数位,这应该给你一种温暖的模糊感觉,他们是对的。
历史上,威廉·香克斯在1873年发表了圆周率到小数点后707位的文章。可怜的家伙,他从小数点后528位开始犯了一个错误。
非常有趣的是,在1995发表了一个算法中,它具有可以直接计算pi无需计算所有先前的数字的第n位(以16为底)的属性!
最后,我希望你最初的算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...这可能是最简单的编程方法,但它也是最慢的编程方法之一。
pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
您可以尝试使用sin和cos的(相当)快速收敛幂级数来计算sin(pi/2)(或cos(pi/2))。(更好的是:使用各种加倍公式来计算更接近x=0的更快收敛。)
sin(pi/2)
cos(pi/2)
x=0
顺便说一句,比使用级数来表示tan(x)更好的是,将cos(x)作为黑盒计算(例如,你可以使用上面的泰勒级数)是通过牛顿进行根查找。当然有更好的算法,但如果你不想验证大量的数字,这应该就足够了(而且实现起来并不棘手,你只需要一点微积分就能理解它为什么有效。)
tan(x)
cos(x)
有一个算法,以数字的方式评估Arctan,只是为了回答这个问题,pi=4 Arctan 1:)