我使用GMP库和C++编写了高斯-勒让德算法的实现来计算pi的位数。它有正确的输出,但问题在于我不知道输出何时“变坏”,因为我必须在代码中指定精度。以下是使用64位精度的输出:3.141592653589793238*35*,最后两个数字是不正确的。我的问题是,如果我想要n位pi,需要多少位精度b和算法迭代次数i?谢谢。
高斯-勒让德算法(又称AGM算法)需要始终保持完全精度。
与牛顿迭代法不同,AGM迭代没有自我修正功能。因此,您需要从一开始就保持完全精度。此外,您需要额外的保护位数。
我的问题是,如果我想要π的
n
位小数,需要多少位精度b
?
首先,您需要将n
(十进制)位转换为b
位二进制位。所以是:
log(10)
b = n ---------- + epsilon
log(2)
其中epsilon
是保护位的数量。需要多少取决于实现和舍入行为,但通常对于任何迭代次数,100位足够了。
至于需要多少迭代,这可以通过经验数据找到。
以下是我编写的一个小应用程序使用 Gauss-Legendre 算法计算 100 百万位数的圆周率的输出:
================================================================
Computing pi to 100000000 digits:
Threads: 8
Starting AGM... 1.394965 seconds
Starting Iteration 0... -3 (error in decimal digits)
Starting Iteration 1... -9
Starting Iteration 2... -20
Starting Iteration 3... -42
Starting Iteration 4... -85
Starting Iteration 5... -173
Starting Iteration 6... -347
Starting Iteration 7... -696
Starting Iteration 8... -1395
Starting Iteration 9... -2792
Starting Iteration 10... -5586
Starting Iteration 11... -11175
Starting Iteration 12... -22352
Starting Iteration 13... -44706
Starting Iteration 14... -89414
Starting Iteration 15... -178829
Starting Iteration 16... -357661
Starting Iteration 17... -715324
Starting Iteration 18... -1430650
Starting Iteration 19... -2861302
Starting Iteration 20... -5722607
Starting Iteration 21... -11445216
Starting Iteration 22... -22890435
Starting Iteration 23... -45780871
Starting Iteration 24... -91561745
Starting Iteration 25... -183123492
AGM: 118.796792 seconds
Finishing... 3.033239 seconds
Radix Conversion... 2.924844 seconds
Total Wall Time: 126.151086 seconds
CPU Utilization: 495.871%
CPU Efficiency: 61.984%
Writing to "pi.txt"... Done
因此,25次迭代足以处理1.83亿位数字。同样,每次迭代都会翻倍,因此您可以运用一些基本的对数数学知识来计算需要多少次迭代。