10 ' 20 ' This program computes pi to up to 2000 places 30 ' pi = Sum from k=1 to infinity of 16*(-1)^(k+1)/((2*k-1)*5^(2*k-1)) 40 ' - Sum from k=1 to infinity of 4*(-1)^(k+1)/((2*k-1)*239^(2*k-1)) 50 ' Ref: "Apple Pi", by Robert Bishop, The BEST of MICRO, Volume 1 60 ' MICRO was a 6502 magazine. It is no longer published. 70 ' 80 ' Updated on 4/7/92 by Lee Bradley, Sysop, Z Node #12, 203 665-1100 90 PRINT:PRINT "Pi Version 3.14":PRINT 100 PRINT "This program computes the value of pi to up to 2000 places." 110 PRINT "Hardcopy wanted (Y/N) "; 120 H$=INKEY$:IF LEN(H$)=0 THEN 120 130 PRINT:INPUT "How many digits do you want (less than 2000) ";SIZE% 140 SIZE%=SIZE%+5:TEN%=10 150 DIM AR%(2048,3),KNST%(2) 160 PW%=1:TR%=2:RESULT%=3:KNST%(1)=25:KNST%(2)=239:DOT$=".":DC%=0 170 PRINT:PRINT "Hit any key to abort.":PRINT:PRINT "Starting pass 1." 180 FOR PASS%=1 TO 2 190 GOSUB 740 200 ' entry point 210 GOSUB 810 220 POIT%=TR%:DV%=EX%:GOSUB 480 230 IF SN%>0 THEN GOSUB 560 ELSE GOSUB 650 240 EX%=EX%+2:SN%=-SN%:POIT%=PW%:DV%=KNST%(PASS%) 250 GOSUB 480:IF PASS%=2 THEN GOSUB 480 260 PRINT DOT$; 270 DC%=DC%+1:IF DC%=60 THEN PRINT:DC%=0 280 IF LEN(INKEY$) THEN PRINT:PRINT:PRINT "Aborted.":PRINT:SYSTEM 290 IF ZERO%<>0 THEN 200 300 PRINT:IF PASS%=1 THEN PRINT "Starting pass 2." 310 NEXT PASS% 320 ' Print the result 330 PRINT "Done.":PRINT:PRINT "Pi to ";SIZE%-5;" decimal places is ":PRINT 340 S$=RIGHT$(STR$(AR%(1,RESULT%)),1)+"." 350 W%=80 ' for readability and memorizability 360 FOR PLACE%=2 TO SIZE%-5 370 S$=S$+RIGHT$(STR$(AR%(PLACE%,RESULT%)),1) 380 IF LEN(S$)<>W% THEN 410 390 PRINT S$ 392 FOR D1%=1 TO 300 393 FOR D2%=1 TO 20000 394 NEXT:NEXT ' Slow down display 395 IF H$="Y" OR H$="y" THEN LPRINT S$ 400 S$="" 410 NEXT PLACE% 420 IF LEN(S$)=0 THEN 450 430 PRINT S$ 440 IF H$="Y" OR H$="y" THEN LPRINT S$ 450 PRINT:PRINT "Press any key ... "; 460 IF LEN(INKEY$)=0 THEN 460 470 SYSTEM 480 ' Divide 490 DIGIT%=0:ZERO%=0 500 FOR PLACE%=1 TO SIZE% 510 DIGIT%=DIGIT%+AR%(PLACE%,POIT%):QUOTIENT%=DIGIT%/DV% 520 RSIDUE%=DIGIT%-QUOTIENT%*DV%:ZERO%=ZERO% OR (QUOTIENT%+RSIDUE%) 530 AR%(PLACE%,POIT%)=QUOTIENT%:DIGIT%=TEN%*RSIDUE% 540 NEXT PLACE% 550 RETURN 560 ' Add 570 CARRY%=0 580 FOR PLACE% = SIZE% TO 0 STEP -1 590 SUM%=AR%(PLACE%,RESULT%)+AR%(PLACE%,TR%)+CARRY%:CARRY%=0 600 IF SUM%=0 THEN 710 700 DF%=DF%+TEN%:LOAN%=1 710 AR%(PLACE%,RESULT%)=DF% 720 NEXT PLACE% 730 RETURN 740 ' Initialize 750 IF PASS%=1 THEN 770 760 FOR PLACE%=0 TO SIZE%:AR%(PLACE%,TR%)=0:AR%(PLACE%,TR%)=0:NEXT PLACE% 770 AR%(1,PW%)=16/PASS%^2 780 IF PASS%=1 THEN DV%=5 ELSE DV%=239 790 POIT%=PW%:GOSUB 480:EX%=1:SN%=3-2*PASS% 800 RETURN 810 ' Copy power to term 820 FOR PLACE%=0 TO SIZE%:AR%(PLACE%,TR%)=AR%(PLACE%,PW%):NEXT PLACE% 830 RETURN