如何计算圆周率?(30分)

Y

yysun

Unregistered / Unconfirmed
GUEST, unregistred user!
我准备使用 huizhang的 PI2.pas, 然后去dwwang提供的站点验证。
最后学习 pegasus 的原理解释。

谢谢 pegasus, dwwang &amp
huizhang.
 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
上次给出的各种计算公式均收敛太慢, 虽然美妙, 但是不够实用, :)
现在再给出一种效率极高的方法: 高斯-勒让德方法
这是一种迭代方法, 每次计算都能使精度成倍提高,
曾经在1989年创造了10亿多位的世界纪录. 下面给
出其计算程序, 迭代4次, 就可以得到30多位正确的
小数位数. 19次就可以超过100万位, 同上次介绍的
那些方法简直不可同日而语, 真是太好了!


Varible:
A, B, C, X, Y: real
{ * }
N: Integer;
Begin
X := 1;
A := 1;
B := sqrt(2);
C := 1/4;
For N:=0 to 3 Do Begin
 Y := A;
 A := (A+B)/2;
 B := sqrt(B*Y);
 C := C - X*(A-Y)*(A-Y);
 X := X + X;
End;
Writeln('Pi is:', (A+B)*(A+B)/4/C);
End.

如果需要更高的精度, 必须把例子程序中的Real类型改为
用户自定义的数据类型, 并相应提供加减乘除计算过程.
(呵呵, Delphi还不支持C++中的运算符重载)
 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
B := sqrt(2);
B := sqrt(B*Y);
???

Peg研究数学入了迷?这怎么能用来算PI呢?
sqrt的精度要到多少才保证迭代19次以后
PI的100万位都是准确的?
 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
>sqrt的精度要到多少才保证迭代19次以后
当然开方也不能用系统中原先提供的子程序啦!
而且开平方是有很快的计算方法的

>这怎么能用来算PI呢
这确实就是目前大型机上用的方法, 可能还有一些改进,
我就不得而知了, (大概是技术秘密)
 
顶部