|
1000桁モードは小数点1000桁までの計算が可能ですが、
有理数モードでは誤差がなく、その桁数はメモリー次第であり、小数点1000桁以上の精度を持つことができます。
ここでは有理数モードを使用し eを2500桁,2の平方根を5000桁,円周率2000桁を末位まで正確に求めます。
有理数→小数の変換に PRINT USING文では1000桁までなので使用しません。
OPTION ARITHMETIC RATIONAL
LET L=LEXP(1)
CALL DIV(L,2500)
PRINT
LET L=SQRT(2)
CALL DIV(L,5000)
PRINT
LET KETA=2000
LET L=183*ATAN(239,INT(KETA/4.75680340489133))+32*ATAN(1023,INT(KETA/6.01975126742432))-68*ATAN(5832,INT(KETA/7.53163503061984))+12*ATAN(110443,INT(KETA/10.0862763900263))-12*ATAN(4841182,INT(KETA/13.3699028197374))-100*ATAN(6826318,INT(KETA/13.6683730315326))
CALL DIV(4*L,KETA)
END
EXTERNAL FUNCTION LEXP(X)
OPTION ARITHMETIC RATIONAL
LET S=1
LET SIGN=1
IF X<0 THEN
LET SIGN=-1
LET X=ABS(X)
END IF
FOR I=1 TO 1000 !'1/1000!≒10^(-2500)
LET X=X/I*SIGN
LET S=S+X
NEXT I
LET LEXP=S
END FUNCTION
EXTERNAL FUNCTION SQRT(T)
OPTION ARITHMETIC RATIONAL
LET X=ABS(T)
FOR I=1 TO 13 !'12~13回程度
LET X=X-(X*X-T)/(2*X) !'ニュートン法
NEXT I
LET SQRT=X
END FUNCTION
EXTERNAL FUNCTION ATAN(X,NN) !'arctan(x)
OPTION ARITHMETIC RATIONAL
LET XX=1+X*X
LET S=1
LET A=1
FOR N=1 TO NN
LET A=A*(2*N)/(2*N+1)/XX
LET S=S+A
NEXT N
LET S=S*X/(1+X*X)
LET ATAN=S
END FUNCTION
EXTERNAL SUB DIV(S,KETA) !'有理数→小数
OPTION ARITHMETIC RATIONAL
LET M=5 !'遅い時は M=10にする
LET A=NUMER(S)
LET B=DENOM(S)
FOR I=0 TO INT(KETA/M)
LET Q=INT(A/B)
LET R=A-Q*B
LET A=R*10^M
IF I=0 THEN
PRINT Q;"."
ELSE
PRINT USING REPEAT$("%",M):Q;
IF MOD(I,100/M)<>0 AND (MOD(I,5/M)=0 OR MOD(I,10/M)=0) THEN PRINT " ";
IF MOD(I,100/M)<>0 AND MOD(I,50/M)=0 THEN PRINT " ";
IF MOD(I,100/M)=0 THEN PRINT ":";I*M
IF MOD(I,1000/M)=0 THEN PRINT
END IF
NEXT I
END SUB
|
|