RosettaCodeData/Task/Pi/Integer-BASIC/pi.basic

46 lines
1.1 KiB
Plaintext

10 REM PI CALCULATION WITH SPIGOT
100 N=100: REM MAX N=260 TO AVOID OVERFLOW
110 LEN=(10*N)/3
120 J=0:K=0:Q=0:NINES=0:PREDIGIT=0
125 DIM A(LEN)
130 REM VARIABLES FOR THE SUB
140 RESULT=0:I=0:X=0
200 REM MAIN
210 FOR J=1 TO LEN:A(J)=2: NEXT J
220 REM START WITH 222...
230 NINES=0
240 PREDIGIT=0
250 REM FIRST PREDIGIT =0
260 FOR J=1 TO N
270 I=N-J: GOSUB 1000:Q=RESULT
275 A(1)=Q MOD 10
280 Q=Q/10
290 IF Q=9 THEN NINES=NINES+1
300 IF Q=10 THEN GOSUB 800
310 IF (Q<>9) AND (Q<>10) THEN GOSUB 900
320 NEXT J
330 PRINT PREDIGIT
340 END
800 PRINT PREDIGIT+1;
805 IF NINES=0 THEN GOTO 820
810 FOR K=1 TO NINES: PRINT 0;: NEXT K
820 PREDIGIT=0:NINES=0
830 RETURN
900 PRINT PREDIGIT;
910 PREDIGIT=Q
920 IF NINES<>0 THEN GOSUB 950
930 RETURN
950 FOR K=1 TO NINES: PRINT 9;: NEXT K
960 NINES=0
970 RETURN
1000 I=I*10/3+16
1010 IF I>LEN THEN I=LEN
1020 RESULT=0
1030 REM REPEAT
1040 X=10*A(I)+RESULT*I
1050 RESULT=X/(2*I-1)
1060 A(I)=X MOD (2*I-1)
1070 I=I-1
1080 IF I>0 THEN GOTO 1040
1090 RETURN