您的位置首页百科知识

马青公式的说明

马青公式的说明

的有关信息介绍如下:

马青公式每计算一项可以得到位的十进制精度。通过适当地编程,可以使它的计算过程中乘数和除数都不超过整型数据范围,所以可以很容易地在计算机上编程实现。无需计算高精度浮点数乘法、除法或平方根,故无需使用复杂的FFT算法加速。

为了计算更高的十进制位数,不仅需要计算更多的项数,还要使用更长的数组来保留更高的精度。故马青公式的时间复杂度为. 故此,如果要计算极多的位数,如百万位以上,一般不使用马青公式。

还有很多类似于马青公式的反正切公式。在所有这些公式中,马青公式是较为简洁且迅速的。 program Pi_Value;

{$APPTYPE CONSOLE}

//将Pi计算精确小数点后100位

//Machin公式

//Pi=16arctan(1/5)-4arctan(1/239)

uses

SysUtils;

const

N=100;

S=2*N+50;

aNum=5;

bNum=239;

type

Num=array [1..S] of byte;

//初始化数组

procedure AZero(var arr:Num);

var

i:smallint;

begin

for i:=1 to S do

arr:=0;

end;

//除法

procedure Division(var arr:Num;const b:smallint);

var

c,y,i:smallint;

begin

c:=0;

for i:=1 to S do

begin

y:=arr+c*10;

c:=y mod b;

arr:=y div b;

end;

end;

//加法

procedure Addition(var arr:Num;const b:Num);

var

i,y,c:smallint;

begin

c:=0;

for i:=S downto 1 do

begin

y:=arr+b+c;

if y>=10 then

begin

c:=1;

arr:=y-10;

end

else

begin

c:=0;

arr:=y;

end;

end;

end;

//减法

procedure Minus(var arr:Num;const b:Num);

var

i,y,c:smallint;

begin

c:=0;

for i:=S downto 1 do

begin

y:=arr-b-c;

if y<0 then

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;

i,j:smallint;

begin

AZero(t);

Ra:=t;Rb:=t;

tag:=true;

writeln('计算中,请等待......');

for i:=1 to N do

begin

a:=t;b:=t;

a[1]:=16;b[1]:=4;

for j:=1 to i*2-1 do

begin

Division(a,aNum);

DiVision(b,bNum);

end;

Division(a,i*2-1);

Division(b,i*2-1);

if tag then

begin

tag:=false;

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],'.');

for i:=2 to N+1 do

write(Ra);

readln;

End.

马青公式的说明