计算pi的位数 我用GMP库和C++来编写高斯勒让德算法的一个实现,计算PI的数字。

计算pi的位数 我用GMP库和C++来编写高斯勒让德算法的一个实现,计算PI的数字。,c++,floating-point,gmp,pi,arbitrary-precision,C++,Floating Point,Gmp,Pi,Arbitrary Precision,它有正确的输出,但问题是我不知道输出在哪一点“变差”,因为我必须在代码中指定精度 以下是使用64位精度的输出:3.141592653589793238*35*,最后两位数字不正确 我的问题是,如果我想要n位数的pi,那么需要多少位精度b,以及需要多少次算法迭代 谢谢高斯-勒让德算法(又名AGM算法)需要全程精确 与牛顿迭代法不同,AGM迭代法不是自校正的。因此,从一开始就需要完全精确。此外,还需要额外的保护数字 我的问题是,如果我想要π的n位数,需要多少位精度b 首先,您需要将n(十进制)数字转

它有正确的输出,但问题是我不知道输出在哪一点“变差”,因为我必须在代码中指定精度

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

我的问题是,如果我想要n位数的pi,那么需要多少位精度b,以及需要多少次算法迭代


谢谢

高斯-勒让德算法(又名AGM算法)需要全程精确

与牛顿迭代法不同,AGM迭代法不是自校正的。因此,从一开始就需要完全精确。此外,还需要额外的保护数字

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

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

        log(10)
b = n ---------- + epsilon
        log(2)
其中,
epsilon
是保护位数。需要多少取决于实现和舍入行为,但通常100位对于任何迭代都足够了

至于需要多少次迭代。这可以通过经验证据发现

下面是我编写的一个小应用程序的输出,它使用高斯-勒让德算法将Pi计算为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亿个数字了。同样,每次迭代它都会加倍,所以你可以运行一些基本对数数学来计算你需要多少次迭代。

是的,你可以去ping Mysticial。如果Dietmar Kühl也有类似的方法来解决iostream问题的话……谢谢,我已经有了一个基本的实现,但是它真的很慢。我做了明显的改进,避免了在每次迭代中重新计算阶乘,但总体上代码仍然相当慢。例如,10000个数字需要8秒钟。这是我的代码,如果有人想看一下:编辑:对不起,这是我的Chudnovsky实现,Gauss Legendre实现还可以。是的,Chudnovsky是另一种动物。因为您需要将它与应用程序结合起来,所以实现起来更加困难。但是如果做得正确,速度会非常快。误差是如何计算的?8个独立的线程做什么?平方根操作非常昂贵,因此我可以理解为什么会将其放在一个单独的线程中,但其余的操作花费的时间相对较少。计算的误差是上一次迭代的两倍。这些线程不相关。此应用程序使用与y-cruncher相同的后端,y-cruncher在大乘法中进行并行处理。它根本不使用GMP。实际上,在顶层没有并行处理。起始错误是什么?看起来像是2.什么,但我找不到任何提到它的地方。