home *** CD-ROM | disk | FTP | other *** search
- {$R+,S+,I+,D+,T-,F-,V+,B+,N-,L+ }
- { PROGRAM PI1.PAS }
-
-
- Uses
- Crt,Dos,Qwik,Wndwvars,Wndw;
-
- VAR
- B,C,V,P1,S,K,N,I,J,Q,M,M1,X,R,D,
- significant_digits : INTEGER;
- P,A,T : ARRAY[0..5000] OF INTEGER;
- TI : STRING[20];
- chr : Char;
- Tim : String;
-
- CONST
- F1=5;
- F2=239;
- DirectVideo=True;
- CheckSnow=False;
- CheckBreak=True;
-
- type
- OnOrOff = (On,Off);
- var
- start, time : real;
-
- procedure info;
- Begin
- SetWindowModes(ShadowRight+Zoommode);
- MakeWindow(4,9,15,61,White+BlueBG,Blue+LightGrayBG,HdoubleBrdr,Window1);
- TitleWindow(Top,Left,'Info for PI.exe');
- AccessWindow(Window1);
- Window(5,10,14,60);
- writeln('Sieve of Eratosthenes');
- writeln;
- writeln('Modified for Turbo Pascal 4.0 by');
- writeln;
- writeln(' Lord Thantos Wyvern');
- writeln;
- writeln('With help from: Ian Samson, Kaptain Krash, Tarin Bul,');
- writeln(' Glenn Lee, and others!');
- Writeln;
- writeln('Press enter to continue');
- Readln(chr);
- Window(0,0,80,25);
- RemoveWindow;
- End;
-
- procedure timer(O : OnOrOff);
-
- var
- recpack : Registers;
- hour,min,sec,hun : integer;
- begin
- with recpack do
- begin
- ax := $2C shl 8;
- end;
- intr($21,Dos.Registers(recpack)); {call interrupt}
- with recpack do
- begin
- hour := cx shr 8;
- min := cx and $FF;
- sec := dx shr 8;
- hun := dx and $FF;
- end;
- if O = On then
- begin
- start := hour * 3600 + min * 60 + sec + hun/100;
- time := 0;
- end
- else
- begin
- time := hour * 3600 + min * 60 + sec + hun/100 - start;
- start := 0;
- end;
- end;
-
-
- 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;
-
- procedure header;
- begin
- CLRSCR;
- WRITELN(' The Computation Of PI');
- Writeln(' --- ----------- -- --');
- end;
-
- procedure mainmenu;
- begin
-
- SetWindowModes(ShadowRight+Zoommode);
- MakeWindow(5,9,11,65,White+BlueBG,Blue+LightGrayBG,DoubleBrdr,Window2);
- TitleWindow(Bottom,Center,'Main Menu');
- Window(10,6,64,14);
- QwriteC(6,1,CRTcols,-1,'Please choose one of the following:');
- GotoXY(16,3);
- Writeln('1) Information about this program');
- GotoXY(16,4);
- Writeln('2) Begin the program');
- GotoXY(16,5);
- Read(chr);
- If chr = '1' then
- begin
- ClrScr;
- info;
- end;
- RemoveWindow;
- Window(0,0,80,25);
- End;
-
-
- {MAIN PROGRAM}
-
- BEGIN
- InitWindow(LightGray+BlueBG,True);
- mainmenu;
- MakeWindow(5,10,7,60,White+BlueBG,LightBlue+LightGrayBG,MhatchBrdr,Window3);
- TitleWindow(Top,Center,'Input Phase!');
- Window(11,6,59,13);
- QwriteC(6,1,CRTcols,-1,'Input no. of decimal places you require:');
- GotoXY(8,2);
- Readln(significant_digits);
- RemoveWindow;
- Window(0,0,80,25);
- m1 := significant_digits;
- M := m1+4;
- MakeWindow(5,10,6,60,White+BlueBG,White+RedBG,LhatchBrdr,Window5);
- Window(11,6,59,6);
- QWriteC(7,1,CRTcols,-1,'Working... Working... Working...');
- Window(0,0,80,25);
- FOR J := 0 TO M DO
- BEGIN
- A[J] := 0;
- T[J] := 0;
- END;
- timer(on);
- TERM1;
- TERM2;
- MULT4;
- timer(off);
- RemoveWindow;
- MakeWindow(4,5,15,65,White+BlueBG,LightBlue+LightGrayBG,HhatchBrdr,Window4);
- TitleWindow(Top,Center,'Computation of PI');
- Window(6,5,64,18);
- wRITE('PI = 3.');
- FOR J := 1 TO M1 DO
- BEGIN
- WRITE(A[J]);
- IF J MOD 5 =0 THEN WRITE(' ');
- IF J MOD 40=0 THEN
- Begin
- Writeln;
- Write(' ');
- End;
- END;
- WRITELN;
- WRITELN;
- str(TIME:6:4,Tim);
- QwriteC(16,6,64,-1,'Elapsed time = '+Tim+' seconds');
- writeln;
- QwriteC(17,6,64,-1,'Sieve of Eratosthenes');
- Window(0,0,80,25);
- End.
-
-
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
- (* Sieve for TURBO PASCAL V2.0 + 3.0 MS-DOS *)
- (* Adapted for TURBO PASCAL by: *)
- (* Daniel E. Salo (74036,2347) *)
- (* Date: 06/30/85 *)
- (* *)
- (* Sieve of Eratosthenes is a popular benchmark program *)
- (* based on a BYTE magazine article by Jim Gilbreath *)
- (* used for comparing relative speed of CPU and compilers. *)
- (* *)
- (* Does 10 iterations of all prime numbers between 1-8191. *)
- (* *)
- (* May be adapted to non MS-DOS systems by removing *)
- (* Procedure Time which does DOS calls. *)
- (* *)
- (* *)
- (* IBM-PC timings (IBM-PC, 640k, 10meg HD,DOS 2.1) *)
- (* *)
- (* TURBO PASCAL v2.00B 18.23 seconds *)
- (* v3.01A 16.64 seconds *)
- (* *)
- (* includes approx .12 secs of housekeeping overhead *)
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
- END.
-
-
- { PROGRAM PI1.PAS
- SEPT 2, 1985
- ( IMPROVED VERSION OF PI.PAS WHICH WAS SLOW AND HAD SOME ERRORS )
-
- 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.
-
- A LITTLE HISTORY
- ----------------
-
- IN AUGUST, 1949, PROFESSOR JOHN VON NEUMANN USED THIS FORMULA TO
- CALCULATE PI TO OVER 2000 DECIMAL PLACES ON THE ENIAC COMPUTER.
- THE CALCULATION WAS COMPLETED OVER THE LABOR DAY WEEKEND WITH THE
- COMBINED EFFORTS OF FOUR ENIAC STAFF MEMBERS EACH WORKING EIGHT-HOUR
- SHIFTS TO ENSURE CONTINUOUS OPERATION OF THE ENIAC.
-
- SOME YEARS AGO I REQUESTED INFORMATION ON PI FROM THE ENCYCLOPEDIA
- BRITANNICA RESEARCH SERVICE. I RECEIVED A REPORT GIVING THE ABOVE
- HISTORICAL ACCOUNT PLUS A LISTING OF THE 2000 DIGITS.
-
- IT WAS THIS LISTING THAT ENABLED ME TO CHECK THE PROGRAM AND KEEP
- MY SANITY.
-
- HAVE FUN
- CINO HILLIARD
- [72756,672] }