计算圆周率的数字

Calculating the digits of pi

本文关键字:数字 圆周率 计算      更新时间:2023-10-16

我已经使用GMP库和c++编写了一个实现高斯-勒让德算法来计算圆周率的数字。

它有正确的输出,但问题是我不知道在哪个点输出"变坏",因为我必须在代码中指定精度。

下面是64位精度的输出:3.141592653589793238*35*,最后两位数字不正确。

我的问题是,如果我想要n个圆周率的数字,那么精度b需要多少位,算法 I 需要多少次迭代?

谢谢

Gauss-Legendre算法(又名AGM算法)要求全程完全精确。

不像牛顿法迭代,AGM迭代不能自我修正。所以从一开始就需要完全精确。此外,您还需要额外的保护数字。

我的问题是,如果我想要pi的n位,需要多少位精度b ?

首先需要将n(十进制)数字转换为b二进制位。也就是:

        log(10)
b = n ---------- + epsilon
        log(2)

其中epsilon为保护位数。您需要多少取决于实现和舍入行为,但通常100位对于任何#次迭代都足够了。

至于你需要多少次迭代。这可以由经验证据来证明。

这是我写的一个小应用程序的输出,它使用高斯-勒让德算法将圆周率计算到1亿位数:

================================================================
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亿个数字。同样,它在每次迭代中都会翻倍,因此您可以运行一些基本的对数数学来计算您需要多少次迭代。