目录
3、 使用P2B3模型,优化非迭代公式(适用于method < 30的所有PI计算公式)的计算方式
1、在调试新功能中发现数据或者内存异常,从而发现了之前版本隐藏较深的BUG,这些BUG在之前的版本运行中未暴露出来,实属意外,目前已经修正:
2、发现Borwein的9次方迭代求PI公式(Method=30)可以通过公式变换,减少1次大数乘法运算:
3、对所有使用refiner进行迭代精度控制的函数进行微调,从之前在每轮迭代结束时检查精度是否达标,前置到迭代过程中的某一步,发现精度达标即退出循环,这样可跳过后面无需执行的步骤。
一、PI的计算方法
程序中实现了4类14种PI的计算方法,每种方法都实测过,确保计算结果的准确性,所有方法至少试验过1~10万位的求解,输出有效数字完全相同,并与y-cruncher等标准程序输出结果进行了对照。
- Method 1-7为类Machin公式,也就是反正切函数的Taylor级数;程序中实现了传统累加法和P2B3模型法(P2B3模型的含义在后面章节有专门介绍)。
- Method 10-16为类BBP级数,包括标准BBP级数、Fabrice Bellard级数,程序实现了传统累加法和P2B3/BBP模型法。
- Method 20-21为类阶乘级数,业界求PI最常使用的Ramanujan公式和Chudnovsky公式,程序实现了传统递进累加法和P2B3模型法。使用了P2B3模型的这两个公式在所有方法中表现出最快的计算性能。
- Method 30-36为理论收敛速度最快的Borwein迭代法,包括9次收敛迭代、2次收敛迭代、4次收敛迭代、3次迭代、5次迭代、16次迭代。尽管理论收敛速度差异很大,但由于迭代步骤的复杂程度,实测中运行最快的是2次迭代法(Method=31),4次迭代性能相似(Method=32)、9次迭代和16次迭代实际运行速度不佳(Method=30、36)。
以下为各种求PI方法的实测性能,注意观察在相同位数情况下各方法的耗时对比,以及不同算法在位数增大10倍时的耗时变化情况,以对各种算法的复杂度有清晰的认识。部分算法因其性能不足以应对太高位数的计算,因此未进行实测。例如对于采用累加求和方式计算的级数,因其算法复杂度为O(n2),也就是说N=100万所消耗的时间为N=10万时的100倍,因此当N为100万时,只实际测试了Ramanujan、Chudnovsky两种最快的方法(其10万位耗时在2秒左右,预测其计算100万位耗时约为几分钟);表中的计算时间单位为秒,该时间不包括最终结果转化为10进制及打印输出的时间。同时,该耗时为在未进行并发优化的单线程模式下的运行时间。
Method |
类别 |
方法 |
选项 |
10万 |
100万 |
1000万 |
1 |
Taylor级数 |
类Machin公式 |
P2B3 |
1.6 |
26 |
- |
累加 |
11.4 |
- |
- |
|||
2 |
P2B3 |
2.0 |
31 |
- |
||
累加 |
9.0 |
- |
- |
|||
3 |
P2B3 |
1.8 |
25 |
- |
||
累加 |
7.7 |
- |
- |
|||
4 |
P2B3 |
2.1 |
31 |
- |
||
累加 |
12.4 |
- |
- |
|||
5 |
P2B3 |
1.7 |
26 |
- |
||
累加 |
8.9 |
- |
- |
|||
6 |
P2B3 |
2.1 |
27 |
- |
||
累加 |
8.6 |
- |
- |
|||
7 |
P2B3 |
2.0 |
28 |
- |
||
累加 |
8.8 |
- |
- |
|||
10 |
BBP分数级数 |
BBP(16) |
P2B3 |
4.3 |
63 |
- |
累加 |
54.7 |
- |
- |
|||
11 |
Fabrice Bellard(1024) |
P2B3 |
3.1 |
55 |
- |
|
累加 |
38.9 |
- |
- |
|||
12 |
BBP(256) |
P2B3 |
2.6 |
46 |
- |
|
累加 |
55.7 |
- |
- |
|||
13 |
BBP(256) |
P2B3 |
2.5 |
47 |
- |
|
累加 |
58.6 |
- |
- |
|||
14 |
BBP(4096) |
P2B3 |
2.6 |
44 |
- |
|
累加 |
57.1 |
- |
- |
|||
15 |
BBP(4096) |
P2B3 |
3.9 |
67 |
- |
|
累加 |
76.3 |
- |
- |
|||
16 |
BBP(65536) |
P2B3 |
3.3 |
50 |
- |
|
累加 |
56.8 |
- |
- |
|||
20 |
阶乘级数 |
Ramanujan |
P2B3 |
0.7 |
11 |
214 |
累加 |
2.3 |