算法参考自:
计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者
分别以Julia 1.72和Delphi 10.3写的算法如下面所示。在一台10年的老电脑(CPU E3 1230v2)测试,计算1万位的Pi值,Julia算法耗时4.87秒,Delphi算法耗时12.3秒。作为比较,原作者的C++Builder算法在他自己的电脑上测到的耗时是8.6秒,而在我的电脑上用C++Builder 6.0,测得原作者算法的耗时为11.7秒。
另外,这里有更快的算法:[Julia语言]使用Chudnovsky 算法快速计算圆周率 Pi (π) 值
#Julia语言
function CalcPi()
ARRSIZE = 10100
DISPCNT = 10000 #定义数组大小,显示位数
#a, b, c, d, Run, Cnt, i::Integer
a = 1; b = 3; Run = 1; Cnt = 0
x = zeros(UInt8, ARRSIZE)
z = zeros(UInt8, ARRSIZE)
x[2] = 2
z[2] = 2
while (Run != 0) && (Cnt < 200000000)
#z*=a
d = 0
for i in ARRSIZE:-1:2
c = z[i]*a + d
d, z[i] = divrem(c, 10)
end
#z/=b
d = 0
for i in 1:ARRSIZE
c = z[i] + d*10
z[i], d = divrem(c, b)
end
#x+=z
Run = 0
for i in ARRSIZE:-1:2
c = x[i] + z[i]
c, x[i] = divrem(c, 10)
x[i-1] += c
Run |= z[i]
end
a += 1
b += 2
Cnt += 1
end
println("计算了", Cnt, "次")
println("Pi = ", x[1], x[2],".")
for i in 1:DISPCNT
if (i != 0) && (mod(i,100) == 0)
println()
end
print(x[i+2])
end
println()
end
@time CalcPi()
//Delphi语言
unit uCalcPi;
interface
procedure CalcPi(var s: String);
implementation
uses Winapi.Windows, System.SysUtils;
const ARRSIZE = 10100;
const DISPCNT = 10000; //定义数组大小,显示位数
procedure CalcPi(var s: String);
var
a, b, c, d, Run, Cnt, i: Integer;
x, z: array[0..ARRSIZE] of Byte;
begin
a := 1; b := 3; Run := 1; Cnt := 1;
ZeroMemory(@x, ARRSIZE);
ZeroMemory(@z, ARRSIZE);
x[1] := 2;
z[1] := 2;
while (Run <> 0) and (Cnt < 200000000) do
begin
//z*=a;
d := 0;
for i := ARRSIZE-1 downto 1 do
begin
c := z[i]*a + d;
z[i] := c mod 10;
d := c div 10;
end;
//z/=b;
d := 0;
for i := 0 to ARRSIZE-1 do
begin
c := z[i] + d*10;
z[i] := c div b;
d := c mod b;
end;
//x+=z;
Run := 0;
for i := ARRSIZE-1 downto 1 do
begin
c := x[i] + z[i];
x[i] := c mod 10;
x[i-1] := x[i-1] + (c div 10);
Run := Run or z[i];
end;
a := a + 1;
b := b + 2;
Cnt := Cnt + 1;
end;
s := Format('计算了 %d 次', [Cnt]) + #13#10;
s := s + Format('Pi=%d%d.', [x[0], x[1]]) +#13#10;
for i := 0 to DISPCNT-1 do
begin
if (i <> 0) and ((i mod 100) = 0) then
begin
s := s + #13#10;
end;
s := s + x[i+2].ToString;
end;
end;
end.