(*$B- Aufgabe 2.29 *) PROGRAM pimege; CONST n=500; m=1; (* m=Packungsdichte. Bei TURBO PASCAL fuehrt m>1 zu integer Ueberlauf. Es werden m*n Stellen von pi berechnet *) TYPE megezahl = ARRAY[0..n] OF integer; VAR a,b,cc,s1,s2,s3 : megezahl; i,imin,c,k : integer; stri: string[30]; tf : text; (*$I add *) (*$I uebertrag *) (*$I sub *) (*$I teil *) (*$I drucken *) PROCEDURE mal(n,k: integer; VAR a:megezahl); VAR i:integer; BEGIN FOR i:= 1 TO n DO a[i]:=a[i]*k END; PROCEDURE arcustan(n,c,k:integer; VAR s: megezahl); VAR t,h : megezahl; i,j,vorzeichen,ia:integer; (* Berechnet s = arctan(1/k). Man vergleiche dazu die Aufgabe 2.14*) BEGIN t[1]:=1; FOR j:=2 TO n DO t[j]:=0; imin:=1; teil(n,c,imin,k,t); s:=t; i:=1; vorzeichen := 1; REPEAT i:=i+2; teil(n,c,imin,k,t); teil(n,c,imin,k,t); ia:=imin; h:=t; teil(n,c,imin,i,h); imin :=ia; vorzeichen := -vorzeichen; CASE vorzeichen OF 1: BEGIN add(n,imin,s,h,s); uebertrag(n,c,s) END; -1: sub(n,c,imin,s,h,s) END; UNTIL imin = n-1 END; BEGIN writeln('Berechnung von pi. Wohin mit dem Output ?'); readln(stri); assign(tf,stri); rewrite(tf); c:=1; FOR i:=1 TO m DO c:=c*10; arcustan(n,c,8,s1); mal(n,24,s1); arcustan(n,c,57,s2); mal(n,8,s2); arcustan(n,c,239,s3); mal(n,4,s3); add(n,1,s1,s2,s1); add(n,1,s1,s3,s1); uebertrag(n,c,s1); writeln(tf, 'Nach Stoermer 24 arctan(1/8) + 8 arctan(1/57) + 4 arctan(1/239)'); drucken(s1); writeln(tf); writeln(tf); arcustan(n,c,18,s1); mal(n,48,s1); arcustan(n,c,57,s2); mal(n,32,s2); arcustan(n,c,239,s3); mal(n,20,s3); add(n,1,s1,s2,s1); sub(n,c,1,s1,s3,s1); uebertrag(n,c,s1); writeln(tf,'Nach Gauss 48 arctan(1/18) + 32 arctan(1/57) - 20 arctan(1/239)'); drucken(s1); writeln(tf); writeln(tf); arcustan(n,c,5,s1); mal(n,16,s1); arcustan(n,c,239,s2); mal(n,4,s2); sub(n,c,1,s1,s2,s1); uebertrag(n,c,s1); writeln(tf,'Nach Machin 16 arctan(1/5) - 4 arctan(1/239)'); drucken(s1); writeln(tf); writeln(tf); close(tf); END.