Contributor: SWAG SUPPORT TEAM { Here's a good (but a little slow) Program to calculate the decimals of Pi : THIS Program CompUTES THE DIGITS of PI USinG THE ARCTANGENT ForMULA (1) PI/4 = 4 ARCTAN 1/5 - ARCTAN 1/239 in CONJUNCTION With THE GREGorY SERIES (2) ARCTAN X = SUM (-1)^N*(2N + 1)^-1*X^(2N+1) N=0 to inFinITY. SUBSTITUTinG into (2) A FEW VALUES of N and NESTinG WE HAVE, PI/4 = 1/5[4/1 + 1/25[-4/3 + 1/25[4/5 + 1/25[-4/7 + ...].].] - 1/239[1/1 + 1/239^2[-1/3 + 1/239^2[1/5 + 1/239^2[-1/7 +...].].] USinG THE LONG divISION ALGorITHM, THIS ( NESTED ) inFinITE SERIES CAN BE USED to CALCULATE PI to A LARGE NUMBER of DECIMAL PLACES in A REASONABLE AMOUNT of TIME. A TIME Function IS inCLUDED to SHOW HOW SLOW THinGS GET WHEN N IS LARGE. IMPROVEMENTS CAN BE MADE BY CHANGinG THE SIZE of THE Array ELEMENTS HOWEVER IT GETS A BIT TRICKY. } Uses Crt; Var B,C,V,P1,S,K,N,I,J,Q,M,M1,X,R,D : Integer; P,A,T : Array[0..5000] of Integer; Const F1=5; Const F2=239; Procedure divIDE(D : Integer); begin R:=0; For J:=0 to M do begin V:= R*10+P[J]; Q:=V div D; R:=V Mod D; P[J]:=Q; end; end; Procedure divIDEA(D : Integer); begin R:=0; For J:=0 to M do begin V:= R*10+A[J]; Q:=V div D; R:=V Mod D; A[J]:=Q; end; end; Procedure SUBT; begin B:=0; For J:=M Downto 0 do if T[J]>=A[J] then T[J]:=T[J]-A[J] else begin T[J]:=10+T[J]-A[J]; T[J-1]:=T[J-1]-1; end; For J:=0 to M do A[J]:=T[J]; end; Procedure SUBA; begin For J:=M Downto 0 do if P[J]>=A[J] then P[J]:=P[J]-A[J] else begin P[J]:=10+P[J]-A[J]; P[J-1]:=P[J-1]-1; end; For J:= M Downto 0 do A[J]:=P[J]; end; Procedure CLEARP; begin For J:=0 to M do P[J]:=0; end; Procedure ADJUST; begin P[0]:=3; P[M]:=10; For J:=1 to M-1 do P[J]:=9; end; Procedure ADJUST2; begin P[0]:=0; P[M]:=10; For J:=1 to M-1 do P[J]:=9; end; Procedure MULT4; begin C:=0; For J:=M Downto 0 do begin P1:=4*A[J]+C; A[J]:=P1 Mod 10; C:=P1 div 10; end; end; Procedure SAVEA; begin For J:=0 to M do T[J]:=A[J]; end; Procedure TERM1; begin I:=M+M+1; A[0]:=4; divIDEA(I*25); While I>3 do begin I:=I-2; CLEARP; P[0]:=4; divIDE(I); SUBA; divIDEA(25); end; CLEARP; ADJUST; SUBA; divIDEA(5); SAVEA; end; Procedure TERM2; begin I:=M+M+1; A[0]:=1; divIDEA(I); divIDEA(239); divIDEA(239); While I>3 do begin I:=I-2; CLEARP; P[0]:=1; divIDE(I); SUBA; divIDEA(239); divIDEA(239); end; CLEARP; ADJUST2; SUBA; divIDEA(239); SUBT; end; {MAin Program} begin ClrScr; WriteLn(' THE CompUTATION of PI'); WriteLn(' -----------------------------'); WriteLn('inPUT NO. DECIMAL PLACES'); READLN(M1); M:=M1+4; For J:=0 to M do begin A[J]:=0; T[J]:=0; end; TERM1; TERM2; MULT4; WriteLn;WriteLn; Write('PI = 3.'); For J:=1 to M1 do begin Write(A[J]); if J Mod 5 =0 then Write(' '); if J Mod 50=0 then Write(' '); end; WriteLn;WriteLn; WriteLn; end.