71 lines
1.8 KiB
Plaintext
71 lines
1.8 KiB
Plaintext
EXTERNAL CLASS BIGNUM;
|
|
BIGNUM
|
|
BEGIN
|
|
|
|
PROCEDURE CALCPI;
|
|
BEGIN
|
|
INTEGER I;
|
|
TEXT Q, R, T, K, N, L;
|
|
COMMENT
|
|
! q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
|
|
;
|
|
Q :- COPY("1");
|
|
R :- COPY("0");
|
|
T :- COPY("1");
|
|
K :- COPY("1");
|
|
N :- COPY("3");
|
|
L :- COPY("3");
|
|
WHILE TRUE DO
|
|
BEGIN
|
|
COMMENT
|
|
! if 4*q+r-t < n*t
|
|
;
|
|
IF TCMP(TSUB(TADD(TMUL("4",Q),R),T),TMUL(N,T)) < 0 THEN
|
|
BEGIN
|
|
TEXT NR;
|
|
OUTTEXT(N);
|
|
I := I + 1;
|
|
IF I = 40 THEN
|
|
BEGIN
|
|
OUTIMAGE;
|
|
I := 0;
|
|
END;
|
|
COMMENT
|
|
! nr = 10*(r-n*t)
|
|
! n = ((10*(3*q+r))//t)-10*n
|
|
! q *= 10
|
|
! r = nr
|
|
;
|
|
NR :- TMUL("10",TSUB(R,TMUL(N,T)));
|
|
N :- TSUB(TDIV(TMUL("10",TADD(TMUL("3",Q),R)),T),TMUL("10",N));
|
|
Q :- TMUL("10",Q);
|
|
R :- NR;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
TEXT NR, NN;
|
|
COMMENT
|
|
! nr = (2*q+r)*l
|
|
! nn = (q*(7*k)+2+(r*l))//(t*l)
|
|
! q *= k
|
|
! t *= l
|
|
! l += 2
|
|
! k += 1
|
|
! n = nn
|
|
! r = nr
|
|
;
|
|
NR :- TMUL(TADD(TMUL("2",Q),R),L);
|
|
NN :- TDIV(TADD(TADD(TMUL(Q,TMUL("7",K)),"2"),TMUL(R,L)),TMUL(T,L));
|
|
Q :- TMUL(Q,K);
|
|
T :- TMUL(T,L);
|
|
L :- TADD(L,"2");
|
|
K :- TADD(K,"1");
|
|
N :- NN;
|
|
R :- NR;
|
|
END;
|
|
END;
|
|
END CALCPI;
|
|
|
|
CALCPI;
|
|
END.
|