将 pi 计算到一百万位小数






4.74/5 (38投票s)
2005 年 9 月 19 日
3分钟阅读

305336

4224
一个简单的程序,运行需要几个小时。
引言
π是数学中最重要的数字之一。它定义为圆的周长与其直径的比率,但在数学的各个领域都出现。它是一个无限长的不循环小数。
在本文中,我不会尝试将π写成希腊字母,因为有些浏览器可能会显示不正确。
计算大量的π位数
有很多方法可以做到这一点。有些方法收敛速度很快,但实现起来很复杂。有些方法易于实现,但收敛速度非常慢。我选择了一种相当简单且收敛速度合理的方法。它基于以下公式
π / 4 = 4 * tan-1(1 / 5) - tan-1(1 / 239)
这是梅钦公式,它是精确的。
tan-1(z) = z - z3 / 3 + z5 / 5 - z7 / 7 + ...
通过包含该级数的足够多项,我们可以达到任何所需的精度。为了获得π的1,000,000位小数精度,我们需要大约715,000项tan-1(1/5)级数和大约210,000项tan-1(1/239)级数,但这不必提前计算出来,附加的程序会在确定达到所需精度时自动停止。
多精度算法
32位整数只能提供大约9位有效数字。为了获得一百万位小数,我简单地实现了所需的多精度算术运算,使用一个大的int
数组。多精度数字封装在CRHMultiLengthInteger
类中。我充分利用了C++中的运算符表示法,使代码看起来就像我们只是在处理普通数字一样。例如
term5m /= n5 * 2 + 1;
看起来它只是将term5m
除以一个数字,但它实际上是调用CRHMultiLengthInteger::operator /=()
。
程序
附带的程序是一个简单的Win32控制台应用程序(它最初是带有MFC支持的标准“Hello,World!”应用程序)。您可以通过将#define NDecimalPlaces (1000100)
更改为其他数字来调整它计算的小数位数。答案写入名为resultNDecimalPlaces.txt的文件中。
关注点
- 上述算法的持续时间为O(n2)。因此,小数位数增加10倍,所需时间将增加约100倍。我的7,000 MIPs PC计算π的前1,000,000位小数大约需要15个小时。总共大约有3.8亿亿条指令。
- 为了获得1,000,000位小数,每个多精度数字都实现为一个包含166685个整数的数组,使用1,000,000为基数,这样每个整数都可以提供6位有效数字。这实际上给了我们1,000,104位小数,但最后几位可能是错误的,因为我们必须丢弃麦克劳林级数的无限多项。与这个进行比较表明最后三位小数是错误的,因此我们实际上得到了精确到1,000,101位小数的π。
- π的前1,000,000位小数首次计算于1973年。
- 19世纪英国数学家威廉·尚克斯使用梅钦公式花了15年以上的时间计算π的前707位。他于1873年发表了他的结果。1944年,人们发现他在第528位犯了一个错误,所有后面的数字都是错误的。通过更改为
#define NDecimalPlaces (1000)
,您现在可以在几秒钟内就能完成威廉·尚克斯15年都未能完成的事情。
为什么?
这篇文章只是为了娱乐。我知道它很简单,但我认为人们可能会对看到它感兴趣。
让计算机计算大量的π位数确实有其用途,它可以用来证明计算机,或者至少它的ALU,正在正常工作。
致谢
非常感谢
- Lim Bio Liong为他优秀的程序,它使我能够捕获上面的窗口快照。
历史
- 2005年9月6日 - 首次提交。