找回密码
 欢迎注册
查看: 14295|回复: 14

[分享] 高精度计算圆周率程序

[复制链接]
发表于 2018-6-12 06:51:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我感觉我已经圆满了。
我从上大学开始就一直在搞这个高精度计算库,现在我把它叫做 ilmp,以前不是这个名字。
这个库,见证了我从学习vb语言,到C++,到C,到汇编的历程。
它从内部用10进制,到10000进制,到1亿进制,再到2^64进制……
从算六千万位数的乘法要五百秒,到100秒,40秒,13秒,7秒,最后是2.5秒……
从代码垃圾得不能看,到现在已经有了相当的自解释能力……
陪我走过四年,如今我也要毕业了。终于可以说,有一个不错的结果了。

我在这里分享一堆源码和一个程序,这些源码是两年前的 ilmp 版本,在 VS 上可以直接编译算圆周率,百万位带输出大概2.5秒左右,这速度不是很快。
里面的 SSA 算法的部分是我下最大精力的部分。直到现在的 ilmp 里,关于SSA的源码基本都是从这拷过来的。

而程序是用现在的 ilmp 版本写的,用来算圆周率。单线程百万位带输出 0.47 秒,我对这个速度很满意了。
如此大的加速,主要来自于
1.汇编过程的手工循环展开,这几乎把所有过程加速100%。
2.写了更多汇编和C的整数除法过程,除法加速了300%以上。
3.快速的 Integer 类,与支持浮点的 Number 类不同,Integer 在每次计算时尽量在原内存上计算,减少 new/delete 的次数。
new和delete 对性能影响很严重,在算圆周率时能让性能折半,而在对小数据计算时甚至会拖慢程序 30 倍。

旧版 ilmp 的代码:
链接:https://pan.baidu.com/s/1oLq_ajiHZ7j6p6014w4dOQ 密码:fqzm

基于新版 ilmp 的圆周率计算器:
https://pan.baidu.com/s/1oWAfzq7TRy2x8-MXZq_yPQ



补充内容 (2022-8-25 04:55):
旧版代码可见9楼,新版程序可见 https://bbs.emath.ac.cn/thread-9477-1-1.html

1M,0.47秒

1M,0.47秒

10M,7.46秒

10M,7.46秒

100M,118秒

100M,118秒

1G,27分16秒

1G,27分16秒

1G的最后几位

1G的最后几位
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-6-12 09:06:16 | 显示全部楼层
才打开一亿位的就死机了

点评

我用vim  发表于 2018-8-31 14:55
打开文本文件?用专业一点的编辑器。或者先打开一个小的文件,在菜单里去掉自动换行,关掉,再打开大的文件。因为自动换行是很慢的。  发表于 2018-6-12 12:49
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-6-15 03:40:38 | 显示全部楼层
图片中1399个数字是不是有问题……
“77”出现了(第3行2次,第6行2次,第9-14行1次,倒数第六行一次)
肉眼看见了11次
pi一般会认为是一个正规数,也就是00-99出现频率大致相同
77出现的频率是不是太高点了?

点评

谢谢指点。话说出现在七百多位的那段7211349999998我是知道的,只是我记得似乎很久以前的确有人通过数字分布异常证明了某个计算圆周率的算法有问题  发表于 2018-6-17 00:39
肉眼不能说明问题。圆周率前1000位数字里,竟然出现了“999999”这样的数串,这是百万分之一的概率,但也是事实。我跟ycruncher比较过十亿位的结果,一丝不差。除了最后一位的2,是19四舍五入上去的。  发表于 2018-6-15 15:12
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-6-19 18:04:56 | 显示全部楼层
确实很快,赞一个。能做到这个需要超强的毅力和坚持。
目前工作比较忙。任意精度快速算法,暂时放下了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2018-8-31 14:55:35 | 显示全部楼层
.·.·. 发表于 2018-6-15 03:40
图片中1399个数字是不是有问题……
“77”出现了(第3行2次,第6行2次,第9-14行1次,倒数第六行一次)
...

这计算圆周率的,还与你使用什么样的算法有关系吧。
不过我没耐心做这个,我只会用mathematica
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-10-1 08:22:47 | 显示全部楼层
你的 ilmp 可以在VB中用吗?我VB懂得多一点。用API的形式 或者 VB类库的形式都行,有这样的方式吗?

另外下载链接都已经过期了,下不了了。

点评

download link available here: https://bbs.emath.ac.cn/thread-9477-1-1.html . I don't know much about VB, but If you could use .dll in VB, the answer should be yes.  发表于 2020-10-8 20:04
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-11-27 10:18:32 | 显示全部楼层
这个,计算圆周率的似乎http://www.numberworld.org/y-cruncher/   用这个更快,不过软件是你的个人作品,比我强太多了,我只会写简单程序
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-7-31 17:23:50 | 显示全部楼层
链接无法下载了

点评

已补。  发表于 2022-8-25 04:56
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2022-8-25 04:54:32 | 显示全部楼层
补个档,这是1楼所说的旧版ilmp代码
旧版ilmp代码.zip (50.91 KB, 下载次数: 1)

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-24 12:01 , Processed in 0.030766 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表