我尝试了各种方法来实现一个按顺序给出圆周率数字的程序。我尝试了泰勒级数方法,但它的收敛速度非常慢(一段时间后我将结果与在线值进行比较)。总之,我正在尝试更好的算法。
所以,在编写程序的时候,我遇到了一个问题,就像所有的算法一样:我怎么知道我计算的n数字是准确的?
- 更像是一个数学问题。好的算法也能估计误差。
- π的值在任何地方都可以得到。使用多个匹配的源以确保它是正确的。我曾经看到过一个"圆周率1000位数"的网站,完全错误。
- 使用spigot算法。在步骤n之后,误差将小于1/16^n。原始文件包含了一个证明为什么它收敛到pi的证据。
- 与圆周率比较?
- @克里斯:"真的到处都是"?
- @轻量赛马Sinorbit,所以我有点夸张了。我的意思是,看看这个。太疯狂了,有多少不同的网站都有圆周率的数字,如果你不能指望它们中的任何一个,你知道现在是神秘答案的时候了。当然,神秘主义的网站是相当可靠的;)
- @Mindor先生-没有必要混淆这个问题,就像没有必要害怕分数一样。
- 我可以帮您查到3.14159265358979323846264383279502,除此之外,为什么您需要这么多数字?(这有点像原子级的精度,有一个宇宙大小的圆。)
- @克里斯"有点"…隐马尔可夫模型。。。252700000个结果与1950000个结果。
- 为什么是C++标签?
- @本利:哦,很好!
- 老天爷,看看这些选票。这个问题发生了什么??
- @轻量RaceSinorbit-Reddit:)
- @斯文特维特:我需要学会怎么做:p
- @是的,我很幸运。&轻量级在轨道上竞赛:一个关于圆周率的问题,世界纪录保持者回答,繁荣的问题变得流行。
- 这似乎更像是一个哲学问题,而不是数学问题。正如您所说,这个问题可以应用于任何算法,但它甚至比这更普遍。我们怎么知道我们相信的一切都是真的?科学方法实际上并不能证明任何数学意义上的东西,它只是提供了一种确认,以加强相信。甚至数学证明也依赖于系统公理和逻辑代数的真理。阅读GEB,看看这是一个无穷大的约简。
- 为什么不直接除以π,检查结果是不是1?(只是开玩笑)
- @Ajhenderson高精度PI可用于数学目的。
- @Ajhenderson,找到大量的π是测试新超级计算机的标准方法。
- @用户1073106-感谢您提供信息。我不是想说没有正当的理由来计算圆周率的更多数字。我完全赞成这样做,只是为了看看我们能走多远,作为一个基准测试。我只知道有很多人想要获得更多的精确性,但他们不理解实际需要的精确性水平,而这些水平是可以记忆的。基于讨论,我不认为这是事实,但我想指出的是,我们讨论的是"乐趣/挑战"因素,而不是实际有用的因素(实际使用挑战除外)。
- @我爸爸,这是最有道理的。这将是一个快速检查。
- 一个非常简单的检查是将您的算法计算到768位小数(不要四舍五入)。那附近的正确数字是:…3499999837…这就是费曼点。如果你的程序不输出这个9的字符串,很容易发现。768是一个相当高的精度,所以当你到达那里时,一个潜在的错误有足够的时间积累起来。
- 查克·诺里斯……他能背圆周率
因为我是圆周率最高位数的世界纪录保持者,我会加上我的两分钱:
除非你真的要创造一个新的世界纪录,否则通常的做法只是根据已知的值来验证计算出来的数字。所以这就足够简单了。
事实上,我有一个网页列出了数字片段,目的是根据它们来验证计算:http://www.numberworld.org/digits/pi/
但当你进入世界纪录领域时,没有什么可比的。
历史上,验证计算数字是否正确的标准方法是使用第二个算法重新计算数字。所以如果两个计算结果都不好,那么末尾的数字就不匹配了。
这通常是所需时间的两倍以上(因为第二个算法通常较慢)。但这是唯一一种验证计算数字的方法,一旦你进入了从未有过的计算数字和新的世界记录的未知领域。
在超级计算机设置记录的时代,通常使用两种不同的AGM算法:
这两种算法都是很容易实现的O(N log(N)^2)算法。
然而,现在情况有所不同。在过去的三个世界记录中,我们使用最快的已知公式(chudnovsky公式)只执行了一次计算,而不是执行两次计算:
这一算法很难实现,但比AGM算法快得多。
然后,我们使用BBP公式对二进制数字进行了验证。
此公式允许您计算任意二进制数字,而不需要计算前面的所有数字。所以它被用来验证最后几个计算出来的二进制数字。因此,它比完整的计算要快得多。
这样做的好处是:
只需要一个昂贵的计算。
缺点是:
需要实现贝利-博文-普劳夫(BBP)公式。
需要另外一个步骤来验证从二进制到十进制的基数转换。
我已经详细介绍了为什么验证最后几个数字意味着所有数字都是正确的。但很容易看到这一点,因为任何计算错误都会传播到最后一位。
现在,最后一步(验证转换)实际上相当重要。以前的一位世界纪录保持者实际上是这样打电话给我们的,因为起初,我没有充分描述它是如何运作的。
所以我从我的博客中提取了这个片段:
1 2
| N = # of decimal digits desired
p = 64-bit prime number |
以10为基数计算a,以二进制计算b。
如果是A = B,那么在"非常高的概率"下,转换是正确的。
欲了解更多信息,请参阅我的博客文章pi-5万亿数字。
- 要回答另一个关于如何知道特定算法何时收敛到n位数的问题:这要求您了解算法的收敛行为。ArcTan(1)的泰勒级数是对数收敛的。所以你需要一个指数级的大量项来收敛-简而言之,不要使用它。
- 查德诺夫斯基的公式似乎是线性收敛的,无论是当我看它,还是当我天真地尝试它。(当我把两个连续的词加在一起时,它也会这样做)。你是否估计了需要先验的项数,然后用分而治之的方法求和?或者别的什么?
- 是的,Chudnovsky的公式每学期都会稳定地收敛到14.18位。所以你可以用总位数除以这个数,得到你需要的术语数。(准确值为:Log(151931373056000)/Log(10) = 14.181647462725477655...)
- 所以实际上你说的是你没有比较两种算法,而是找到了另一种解决方案。
- @埃里克布85有点。BBP公式(在某种程度上)算作第二种算法。但就其本身而言,这是不够的,因为它没有验证到基10的转换。使用bbp+转换检查来消除第二次计算的需要,这不是我的想法。这是FabriceBellard在2009年创造的世界纪录中首次做到的。这是一个好主意,我们也这样做了,并改进了它。
- @Shaquintrifonoff有什么意义?
- @我只能为自己说话,但事实上我从来没有真正关心过圆周率。对我来说,这只是另一个数字。该值不在数字本身或10兆字节的无用数字中,而是用于实现该值的方法。数个世纪的数学和数十年的计算机/编程研究促成了这一壮举,它们适用于许多其他领域,因此比数字硬盘更有价值。简而言之:计算圆周率的数字更像是一项运动。
- 真的!我看到你现在也计算到了10万亿位数…有没有办法不经过一年的处理就能得到一个包含所有这些数字的文件?:)顺便说一下,回答得很好。有意思的做法是:pi.nersc.gov,按照:i.stack.imgur.com/ogaxs.png的行进行。
- 不是说我有10兆字节可用…
- @直到去年12月,我还可以通过BitTorrent下载前5万亿个数字。但自从我离开学校后,我就再也没有足够的带宽来播种了。所以我只能在特定的偏移量处处理少量数字的请求。有几个重量级的数学家来找我,他们对数字的统计很感兴趣。他们最终给了我一个我在本地运行的程序。
- @神秘的,只是从另一个stackoverflow问题上偶然发现了你的圆周率计算站点,忍不住对你们所做的傻笑和傻笑。喜欢日志中的硬盘故障/地震:)太棒了!
- 这是鱼精酱吗?
- 我读到一些较新的计算机内置了十进制(即基数10)算术的硬件。有人应该使用这样的硬件直接计算π的基础10,如果没有其他原因,除了作为一个压力测试的硬件。
- Waiiiiiiit。如果两个结果不匹配怎么办?你有备份算法吗?
- @用户3576467如果结果不匹配,则表示硬件、软件或实现中存在错误。这不是公式中的错误,因为公式已经被数学证明是正确的。因此,如果结果不匹配,它将成为一个巨大的调试问题。幸运的是,这还没有发生,因为设计了许多保护措施来尽早发现错误。
毫无疑问,为了您的目的(我认为这只是一个编程练习),最好的方法是对照Web上的任何PI数字列表检查您的结果。
我们怎么知道这些值是正确的呢?我可以说,有很多计算机科学的方法可以证明算法的实现是正确的。
更切合实际的是,如果不同的人使用不同的算法,并且他们都同意(选择一个数字)1000(百万,无论什么)个小数位,这应该会给你一种温暖的模糊的感觉,他们得到了正确的。
历史上,威廉·山克斯在1873年出版了小数点后707位。可怜的家伙,他犯了一个错误,从小数点后528位开始。
非常有趣的是,1995年,一种算法被发布,它具有直接计算π的第n位(以16为基数)而不必计算所有之前的数字的特性!
最后,我希望您的初始算法不是pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...,这可能是最简单的编程方法,但也是最慢的编程方法之一。查看维基百科上的pi文章,了解更快的方法。
- 最后一个公式(莱布尼兹公式,IIRC)实际上是加减交替的。
您可以使用多个方法,看看它们是否收敛到同一个答案。或者从"网"中抓一些。Chudnovsky算法通常是一种非常快速的计算圆周率的方法。http://www.craig-wood.com/nick/articles/pi-chudnovsky/
- 减少了机会,但我仍然不能确定多方法解决方案,如果两者都是错误的呢?检查网络并不能保持有效性,那么为什么不从网络本身取值呢?我在想BBP,哪一个更适合?
- @如果两个算法是独立的,那么两个计算结果相同的错误概率几乎为零。如果在两种计算中出现任何错误,最终结果都将不匹配-因此您知道至少有一种结果是错误的。
泰勒级数是求圆周率的一种方法。如前所述,它收敛缓慢。
泰勒级数的部分和可以证明在下一项的某个乘数内,远离π的真值。
其他近似PI的方法也有类似的方法来计算最大误差。
我们知道这是因为我们可以用数学证明它。
- 附议。我认为这里的大多数答案只是对数学证明的概念不够重视。无论你的程序是用来计算圆周率的数字,它永远不会比最令人信服的数学证明更有说服力,证明你的程序的方法确实计算圆周率。这就暗示了对程序的另一个约束,即pi计算pi:它们应该尽可能多地关注性能和正确性的可理解性。
您可以尝试使用(相当)为sin和cos快速聚合的幂级数来计算sin(pi/2)或cos(pi/2)。(更好的是:使用各种加倍公式计算更接近的x=0,以便更快地收敛。)
顺便说一句,在计算上说,cos(x)是一个黑匣子(例如,你可以使用上面提到的泰勒级数),比在tan(x)上使用series更好的方法是通过牛顿进行根查找。当然有更好的算法,但是如果你不想验证大量的数字,这就足够了(而且实现起来并不那么困难,你只需要一点微积分就可以理解它的工作原理)。
- 我不太明白第1000位数字是1的。你需要非常精确的EDOCX1[0]值,不是吗?
- 我不知道该怎么说前面的答案,除非它是一个笑话或什么的。sin(pi/2)=1 cos(pi/2)=0,所以,我认为这些肯定收敛得很快。
- 我想对每个人来说,评估sin(x)和cos(x)的高精度实际上比计算pi本身要困难得多,这并不明显。
- 出于明显的原因,您不应该为此使用sin(pi/2)。最好使用sin(pi/6),并确保其精确到1/2。