Genaue Pi-Berechnung Turbo Pascal

aus Paswiki Turbo Pascal, der freien Wissensdatenbank

Beschreibung

Die hier angegebene Pi-Berechnung ist in der Lage

die irrationale Zahl PI bis zu 48.000 (!) Stellen nach dem Komma zu bestimmen.


Programm

program arctanmp;  { pi-Berechnung mittels arctan und mp }
{$N+}
{$R-}
uses dos,crt;
             { range-checking Ausschalten -> schneller }
const
  SIZE = 6;  { hier gewünschte (Stellenanzahl : 9) eingeben ! }
  BASIS = 1e9;
  BASEDIGITS = 9;

type
  Bignum = array[1..SIZE] of longint;
var
  pi, powers, term: Bignum;

procedure bigclear(var dest: Bignum);
var
  i: integer;
begin
  for i:=1 to SIZE do dest[i] := 0;
end;

function bigiszero(var src: Bignum): boolean;
var
  i: integer;
begin
  bigiszero := false;
  for i:=1 to SIZE do
    if src[i] <> 0 then exit;
  bigiszero := true;
end;

procedure bigdiv(var dest, src: Bignum; divisor: double);
var
  rest, t: double;
  i: integer;
begin
  rest := 0;
  for i:=1 to SIZE do begin
    t := rest*BASIS + src[i];
    dest[i] := trunc(t / divisor);
    rest := (t - divisor*dest[i]);
  end;
end;

procedure bigadd(var dest, src1, src2: Bignum);
var
  i: integer;
  sum, carry: double;
begin
  carry := 0;
  for i:=SIZE downto 1 do begin
    sum := src1[i] + src2[i] + carry;
    if sum >= BASIS then begin
      carry := 1;
      sum := sum - BASIS;
    end else begin
      carry := 0;
    end;
    dest[i] := trunc(sum);
  end;
end;

procedure bigsub(var dest, src1, src2: Bignum);
var
  i: integer;
  diff, borrow: double;
begin
  borrow := 0;
  for i:=SIZE downto 1 do begin
    diff := src1[i] - src2[i] - borrow;
    if diff < 0 then begin
      borrow := 1;
      diff := diff + BASIS;
    end else begin
      borrow := 0;
    end;
    dest[i] := trunc(diff);
  end;
end;

procedure addterm(mult, denom: longint; sign: integer);
var
  denom2, divisor: double;
begin
  denom2 := sqr(denom);
  divisor := 1;
  bigclear(powers);
  powers[1] := mult*denom;
  repeat
    bigdiv(powers, powers, denom2);
    bigdiv(term, powers, divisor);
    if sign = +1
      then bigadd(pi, pi, term)
      else bigsub(pi, pi, term);
    sign := -sign;
    divisor := divisor+2;
  until bigiszero(term);
end;

procedure bigprint(var src: Bignum);
var
  i, j: integer;
  s: string[9];
begin
  for i:=1 to SIZE do begin
    str(src[i]:BASEDIGITS, s);
    for j:=1 to BASEDIGITS do
      if s[j] = ' ' then s[j] := '0';
    write(s);
  end;
end;

var
  start, stop: longint;
  systicks: longint absolute $40:$6c;
begin
  start := systicks;

  bigclear(pi);
{ Formel von Machin }
  addterm(16, 5, 1);
  addterm(4, 239, -1);

  writeln;
  bigprint(pi);
  gotoxy(1,2);write(' PI =  3.');
  writeln;

  stop := systicks;
  writeln((stop-start)/18.2:0:1, ' s');
readln;
end.


mit freundlicher Unterstützung der Autoren:
Christoph Hertel und Philipp Kaerger (Uni Leipzig) 


--Gastarbeiter 14:18, 13. Mär 2006 (CET)


'Persönliche Werkzeuge
Extras