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)
