马青公式的说明
的有关信息介绍如下:马青公式每计算一项可以得到位的十进制精度。通过适当地编程,可以使它的计算过程中乘数和除数都不超过整型数据范围,所以可以很容易地在计算机上编程实现。无需计算高精度浮点数乘法、除法或平方根,故无需使用复杂的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.