RosettaCodeData/Task/Pi/Simula/pi-2.simula

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.