我正在尝试各种方法来实现一个程序,该程序顺序给出pi的数字。我尝试了泰勒级数方法,但是事实证明,它收敛非常慢(当我将我的结果与在线值进行比较之后会比较)。无论如何,我正在尝试更好的算法。
因此,在编写程序时,就像所有算法一样,我陷入了一个问题:我怎么知道n
我计算出的数字是准确的?
我正在尝试各种方法来实现一个程序,该程序顺序给出pi的数字。我尝试了泰勒级数方法,但是事实证明,它收敛非常慢(当我将我的结果与在线值进行比较之后会比较)。无论如何,我正在尝试更好的算法。
因此,在编写程序时,就像所有算法一样,我陷入了一个问题:我怎么知道n
我计算出的数字是准确的?
Answers:
由于我目前是pi位数最多的世界纪录保持者,因此我将加两分:
除非您实际上要设置新的世界纪录,否则通常的做法是仅根据已知值验证计算出的数字。这很简单。
实际上,我有一个网页列出了一些数字片段,目的是验证它们的计算结果:http : //www.numberworld.org/digits/Pi/
但是,当您进入世界纪录的领土时,没有什么可比的。
从历史上看,用于验证计算出的数字正确的标准方法是使用第二种算法重新计算数字。因此,如果其中任何一项计算出错,则末尾的数字将不匹配。
这通常需要的时间会增加一倍以上(因为第二种算法通常较慢)。但这是一旦您进入从未计算过的数字和新的世界纪录的未知领域之后,验证已计算数字的唯一方法。
这两种O(N log(N)^2)
算法都相当容易实现。
但是,如今情况有所不同。在最近的三个世界记录中,我们没有执行两次计算,而是使用最快的已知公式(Chudnovsky公式)仅执行了一次计算:
该算法难以实现,但比AGM算法要快得多。
此公式使您可以计算任意二进制数字,而无需先计算所有数字。因此,它用于验证最后几个计算出的二进制数字。因此,它比完整的计算要快得多。
这样做的好处是:
缺点是:
我已经掩盖了为什么验证最后几位数字意味着所有数字都是正确的一些细节。但是很容易看到这一点,因为任何计算错误都会传播到最后几位。
现在,最后一步(验证转换)实际上非常重要。以前的世界纪录保持者之一实际上是在呼吁我们这样做,因为起初,我没有对其进行充分的描述。
因此,我从我的博客中提取了以下代码段:
N = # of decimal digits desired
p = 64-bit prime number
使用以10为底的算术计算A,使用二进制算术计算B。
如果为A = B
,则“概率很高”,则转换正确。
有关更多阅读,请参阅我的博客文章Pi-5万亿位数。
ArcTan(1)
是对数收敛的。因此,您需要大量的项来收敛-简而言之,不要使用它。
Log(151931373056000)/Log(10) = 14.181647462725477655...
)
毫无疑问,出于您的目的(我认为这只是编程工作),最好的办法是对照网络上pi位数的任何列表检查结果。
我们怎么知道这些值是正确的?好吧,我可以说有一些计算机科学的方法来证明算法的实现是正确的。
更加务实的是,如果不同的人使用不同的算法,并且他们都同意(选择一个数字)一千(百万,无论是多少个)小数位,那应该给您一种温暖的模糊感觉,使他们感到正确。
从历史上看,威廉·尚克斯(William Shanks)在1873年将pi发布到707个小数位。可怜的家伙,他从第528个小数位开始犯了一个错误。
非常有趣的是,在1995 年发布了一种算法,该算法具有直接计算pi的第n个数字(以16为底)而不必计算所有先前的数字的属性!
最后,我希望您的初始算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
最简单的编程方法,但是它也是最慢的方法之一。请查看Wikipedia上的pi文章,以获取更快的方法。
您可以使用多种方法,看看它们是否收敛于相同的答案。或从网上获取一些。Chudnovsky算法通常用作计算pi的非常快速的方法。http://www.craig-wood.com/nick/articles/pi-chudnovsky/
泰勒级数是近似pi的一种方法。如前所述,它收敛缓慢。
泰勒级数的部分和可以显示为与pi的真值相距在下一项的乘数内。
近似pi的其他方法具有类似的方法来计算最大误差。
我们知道这一点是因为我们可以用数学方法证明它。
您可以尝试使用(相当)快速收敛的正弦和余弦幂级数进行计算sin(pi/2)
(或cos(pi/2)
就此而言)。(甚至更好:使用各种加倍公式来计算更接近的值,x=0
以加快收敛速度。)
顺便说一句,比起使用序列而言,更好tan(x)
,用cos(x)
一个黑匣子计算(例如,您可以使用上述的taylor序列)是通过牛顿进行寻根。当然那里有更好的算法,但是如果您不想验证大量的数字,这就足够了(并且实现起来并不是那么棘手,并且您只需要一点微积分就可以理解它的工作原理。)
sin(pi/2)
吗?
sin(x)
和cos(x)
对精度高,其实很多不是计算丕本身更加困难。