高精度高性能PI值计算程序设计和验证

目录

一、PI的计算方法

二、代码说明

   1、类定义

   1)class fftpack:

  2)class longfloat:

 3) class fft:

  4)class refiner:

  5)class pulser:

6)Class P2B3:

7)Class xthread:

8)Class xtask、Class xqueue:

9)Class mulwise

三、优化设计及版本历史

初始版本

2021年4月7日:

1、longfloat内部序列使用二进制代替10进制

2、   优化绝对值小于1的longfloat的有效长度      

3、   使用P2B3模型,优化非迭代公式(适用于method < 30的所有PI计算公式)的计算方式

4、使用Karatsuba机制,提升长乘法的效率和精度

5、使用gcc/g++嵌入式汇编指令优化除法

6、其他

未来优化方向

1、使用SSE/SSE2、AVX指令集优化

2、使用并行计算优化

3、进制转换优化

4、增加乘数FFT缓存

2021年4月14日:

1、在调试新功能中发现数据或者内存异常,从而发现了之前版本隐藏较深的BUG,这些BUG在之前的版本运行中未暴露出来,实属意外,目前已经修正:

2、进制转换算法的实现和优

3、修改了pulser的实现机制

2021年4月16日:

2021年4月18日

1、发现并修正了程序中存在的个别缺陷和隐患

2、发现Borwein的9次方迭代求PI公式(Method=30)可以通过公式变换,减少1次大数乘法运算:

3、对所有使用refiner进行迭代精度控制的函数进行微调,从之前在每轮迭代结束时检查精度是否达标,前置到迭代过程中的某一步,发现精度达标即退出循环,这样可跳过后面无需执行的步骤。

2021年4月22日


一、PI的计算方法

     程序中实现了4类14种PI的计算方法,每种方法都实测过,确保计算结果的准确性,所有方法至少试验过1~10万位的求解,输出有效数字完全相同,并与y-cruncher等标准程序输出结果进行了对照。

  1. Method 1-7为类Machin公式,也就是反正切函数的Taylor级数;程序中实现了传统累加法和P2B3模型法(P2B3模型的含义在后面章节有专门介绍)。
  2. Method 10-16为类BBP级数,包括标准BBP级数、Fabrice Bellard级数,程序实现了传统累加法和P2B3/BBP模型法。
  3. Method 20-21为类阶乘级数,业界求PI最常使用的Ramanujan公式和Chudnovsky公式,程序实现了传统递进累加法和P2B3模型法。使用了P2B3模型的这两个公式在所有方法中表现出最快的计算性能。
  4. 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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值