[Julia&Delphi]快速计算圆周率 Pi (π) 值

算法参考自:

        计算圆周率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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值