资源描述:
《圆周率π的计算方法》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、圆周率π的计算方法圆周率的计算方法古人计算圆周率,一般是用割圆法。即用圆的内接或外切正多边形来逼近圆的周长。Archimedes用正96边形得到圆周率小数点后3位的精度;刘徽用正3072边形得到5位精度;LudolphVanCeulen用正262边形得到了35位精度。这种基于几何的算法计算量大,速度慢,吃力不讨好。随着数学的发展,数学家们在进行数学研究时有意无意地发现了许多计算圆周率的公式。1、 Machin公式这个公式由英国天文学教授JohnMachin于1706年发现。他利用这个公式计算到了100位的圆
2、周率。Machin公式每计算一项可以得到1.4位的十进制精度。因为它的计算过程中被乘数和被除数都不大于长整数,所以可以很容易地在计算机上编程实现。用马青公式计算Pi至小数点后100位程序 programPi_Value; {$APPTYPECONSOLE} //将Pi计算精确小数点后100位 //Machin公式8 //Pi=16arctan(1/5)-4arctan(1/239) uses SysUtils; const N=100; S=2*N+50; aNum=5; bNum=
3、239; type Num=array[1..S]ofbyte; //初始化数组 procedureAZero(vararr:Num); var i:smallint; begin fori:=1toSdo arr:=0; end; //除法 procedureDivision(vararr:Num;constb:smallint); var c,y,i:smallint; begin c:=0; fori:=1toSdo begin y:=arr+c*10; c:=
4、ymodb; arr:=ydivb; end; end; //加法 procedureAddition(vararr:Num;constb:Num); var i,y,c:smallint; begin c:=0; fori:=Sdownto1do8 begin y:=arr+b+c; ify>=10then begin c:=1; arr:=y-10; end else begin c:=0; arr:=y; end; end; end; //减法 pr
5、ocedureMinus(vararr:Num;constb:Num); var i,y,c:smallint; begin c:=0; fori:=Sdownto1do begin y:=arr-b-c; ify<0then begin c:=1; arr:=10+y; end else begin c:=0; arr:=y; end; end; end; var tag:boolean; a,b,Ra,Rb,t:Num;8 i,j:smallint; be
6、gin AZero(t); Ra:=t;Rb:=t; tag:=true; writeln('计算中,请等待......'); fori:=1toNdo begin a:=t;b:=t; a[1]:=16;b[1]:=4; forj:=1toi*2-1do begin Division(a,aNum); DiVision(b,bNum); end; Division(a,i*2-1); Division(b,i*2-1); iftagthen begin tag:=fal
7、se; Addition(Ra,a); Addition(Rb,b); end else begin tag:=true; Minus(Ra,a); Minus(Rb,b); end; end; Minus(Ra,Rb); writeln('计算结果如下:'); writeln(Ra[1],'.'); fori:=2toN+1do write(Ra); readln; End.8还有很多类似于Machin公式的反正切公式。在所有这些公式中,Machin公式似乎是最快的了。虽
8、然如此,如果要计算更多的位数,比如几千万位,Machin公式就力不从心了。下面介绍的算法,在PC机上计算大约一天时间,就可以得到圆周率的过亿位的精度。这些算法用程序实现起来比较复杂。因为计算过程中涉及两个大数的乘除运算,要用FFT(FastFourierTransform)算法。FFT可以将两个大数的乘除运算时间由O(n2)缩短为O(nlog(n))。2、 Ramanujan公式1914年,印度数学家Sriniv