计算圆周率PI的算法

ljlwater 2002-10-01 08:23:10
现代的计算机可以把圆周率计算到数亿位,请问有没有人知道这是如何实现的?
类似的还有自然对数底e

期待高手,解决立马给分!
...全文
1845 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_heart 2002-12-10
  • 打赏
  • 举报
回复
up
lizhongkun 2002-10-14
  • 打赏
  • 举报
回复
说 错了!和和 !嘿
摩特卡罗法!
lizhongkun 2002-10-12
  • 打赏
  • 举报
回复
还可以用
多特魔德法!!!!
wyb_Ultra 2002-10-09
  • 打赏
  • 举报
回复
忘了告诉大家,目前PC机上流行的最快的圆周率计算程序是PiFast,PC机上的最高计算记录12,884,901,372位。使用Chudnovsky公式计算,速度最快。还可以使用Ramanujan公式,速度慢大约40%。PiFast可以利用磁盘缓存,突破物理内存的限制进行超高精度的计算,最高计算位数可达240亿位,并提供基于Fabrice Bellard公式的验算功能。它除了计算圆周率,还可以计算e和sqrt(2)。
wyb_Ultra 2002-10-08
  • 打赏
  • 举报
回复
第二个是PIFast,现在最新的版本是4.1,是一个法国人写的。日本人的程序是在大型机上运行的,而PIFast完完全全是在PC机运行的,主要是用了FFT,所以速度很快,快得你不相信,比PC版的SuperPI快很多。但是具体算法就不是很清楚,大家可以到他的网站看看。
http://numbers.computation.free.fr/Constants/constants.html
WYBULTRA 2002-10-08
  • 打赏
  • 举报
回复
连续的回复不能超过三次!
wyb_Ultra 2002-10-08
  • 打赏
  • 举报
回复
Introduction of Kanada Lab.

Field of Research:
High Performance Computing, Virtual Workstation System, Research on Research, Computer Algebra

Name of Laboratory:
Laboratory for Computational tools

Location:
University of Tokyo. Information science.

Name of staff:
Yasumasa KANADA (Associate Professor)
Akira YOSHIOKA (Research Associate)

网站在东京大学里,要找还是可以的。
wyb_Ultra 2002-10-08
  • 打赏
  • 举报
回复
现在回答楼主的问题,真正能算PI的程序我只见过两个。
第一个是流行测试 CPU 的 SuperPI 程序。这个程序是由日本人用 F2C 把 Fortran 的源程序改成 C 的,改得适合在PC机上使用,使用的就是 Gauss-Legendre algorithm (高斯-勒让德)算法。而那个Fortran程序就是由近年来一直刷新世界纪录的那两个日本人 Yasumasa KANADA (Associate Professor) 和 D.Takahashi 写的,其实是刷新自己的记录而已。他们使用的是Gauss-Legendre algorithm算法和Borwein's 4-th order convergent algorithm算法,也许Fortran更适合科学计算。具体的算法我就不贴出来了,如果大家有兴趣可以找一下,简单的说就是用迭代法。关键问题已经不是寻找算法,而是怎样在更好的在计算机里实现算法,如何存储结果等。
MarsZhangLing 2002-10-08
  • 打赏
  • 举报
回复
网址我快不记得了,不过我下载的那个程序我特意也superPI比了一下,
算的少的话,看不出差距,越大差距越大,
那个程序比super pi 快多了!
不过他用了那个Apf233,里面一堆汇编文件,我好不容易才在VC6。0下编译通
过,运行。
supercctv 2002-10-07
  • 打赏
  • 举报
回复
去年大一的时候,因为老师悬赏,我写了一个能计算pi的程序。
用turbo pascal 7.0写的,当时整整花了一周的时间,什么事都没干。
程序能计算到8000位,1000位的时间大概在15分钟。当然由于当时急着交作业,也就没对算法进行优化。总的思路如下:
1.要定义4个高精度的计算,加、减、乘、除。
2.然后找一个收敛比较快的公式,(现在我忘了)
3.按照公式计算,只不过所有的运算都必须是高精度运算。
由于在dos下,内存的空间有限,因此数组最多只能到8000个元素,如果在windows中用delphi或者是c++builder可以计算得更多。
我写了200行的源代码,不过我觉得这挺有意思的,至少能够说明自己编程的水平。有兴趣的话,或者需要源程序,我们可以联系.
我的电邮是supercctv@sina.com
wyb_Ultra 2002-10-07
  • 打赏
  • 举报
回复
大家不用忙着贴代码,先听我慢慢说。下面的公式一般我们叫做马庭公式:
pi = 24 * arctan(1/8) + 8 * arctan(1/57) + 4 * arctan(1/239)
如果不是要求太高,用上面的公式就行了,原因就是因为编程比较简单。去年,我曾经花了几个月去研究这个问题。我找了不少资料,参照了这个网站的信息:http://www.jason314.com/ ,后来改进了站长的汇编程序,如果没记错,速度可以在几小时内算到一百万位。但这已经是马庭公式这类型的算法的极限。我国内下载的程序也没有超越这个速度的。这类的公式还有更快的,如下,但是我想速度也不会有什么突破。
Pi/4 = 22*arctan(1/28)+2*arctan(1/443)-5*arctan(1/1393)-10*arctan(1/11018)
Pi/4 = 44*arctan(1/57)+7*arctan(1/239)-12*arctan(1/682)+24*arctan(1/12943)
laughcry2002 2002-10-07
  • 打赏
  • 举报
回复
参考了手边的几本书, 比较的结果是在众多的展开式中, 以下式收敛较快

pi = 24 * arctan(1/8) + 8 * arctan(1/57) + 4 * arctan(1/239)

其中, 在计算时将 arctan 函数用级数展开.

不知大家有何看法?
0738111080 2002-10-07
  • 打赏
  • 举报
回复
vgrtgfg
yaos 2002-10-07
  • 打赏
  • 举报
回复
以100000000为例,我说的方法内存占用大于pi的内存占用的8倍,而pi占用
100000000/8*0.3010,所以总的内存占用为330MB左右,要是没有大的内存,就免了。还有,总共需要26步迭代,每次要是用到1分钟的时间,你的程序就很快了。记住,计算乘法使用的FFT算法,最大的运算位数只是几千位,要是计算一亿位,就会需要特殊的算法.
LoneStar0124 2002-10-07
  • 打赏
  • 举报
回复
http://www.jason314.com/
这个网站把PI介绍的很详细
我用其中的Bailey-Borwein-Plouffe算法的改进算法经过优化后计算PI小数点后100,000位仅用1秒钟。
还有更优的计算公式,不过我不大会实现。
MarsZhangLing 2002-10-06
  • 打赏
  • 举报
回复
恐怕编程的时间要远远超过最后算出PI的时间.
呵呵,这倒不至于,不过确实非常的麻烦!
而且很多都没办法,不得不用汇编写(用C的话效率就要低一倍以上,没办法。还的稍微利用一点硬件的特性!
哎算几亿,太麻烦了,
算个2万吧,又太容易。哎。
xzhuang 2002-10-06
  • 打赏
  • 举报
回复
还有一种用概率来求的。用园和矩形,然后随机生成点。根据点落的在矩形内的多少。然后依据几何概型来求!
yaos 2002-10-06
  • 打赏
  • 举报
回复
e就好算多了,直接求1/n!的和就可以了
yaos 2002-10-06
  • 打赏
  • 举报
回复
有二次收敛算法,就是如果这次精度是1000位,下一次计算可以达到2000位精度,就是比较复杂,要是几亿位,恐怕编程的时间要远远超过最后算出PI的时间.
sqrt()表示平方根运算
x0=sqrt(2)
pi0=2+sqrt(2)
y0=sqrt(sqrt(2))

x(i+1)=1/2*(sqrt(x(i)) + 1/sqrt(x(i)))
pi(i+1)=pi(i)*(x(i+1)+1)/(y(i)+1)
y(i+1)=(y(i)*sqrt(x(i+1)) + 1/sqrt(x(i+1))) / (y(i) + 1)

希望没有打错。
算法用到了平方根运算,乘除法,必须运用FFT算法。
MarsZhangLing 2002-10-06
  • 打赏
  • 举报
回复
呵呵,我有原代码,可是只能算几万的,算不了几亿的,算几亿靠我的
塞杨二566恐怕不行,!!!
如果只是几百万的话,还没问题,到几亿,而你又不想等的话,就必须靠
fft(算是FFT的变种吧!)具体贴起来可就多了。
加载更多回复(24)

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧