EXPORT PI_CALC2B() BEGIN LOCAL digits=1000 ; // 計算する桁数 LOCAL k := 6 ; // 変数あたりの桁数 INPUT(digits,"計算桁数","digits=","計算する桁数",1000,100); INPUT(k,"変数あたりの桁数","base=","変数の桁数",6,6); LOCAL base := 10^k ; // 基底 LOCAL ARRYS := floor(digits/k)+1; // 配列数 LOCAL e := floor(k/log(2)) ; // 1ループあたり省略できる計算項数 LOCAL f := floor((digits+1)/log(2)) ; // 計算項数 LOCAL temp,denom; LOCAL n, i, j, g, w, cy, s, t; LOCAL skip:=0; LOCAL str0, str1; // 配列 初期化 L6:=MAKELIST(0.0,X,1,ARRYS,1); L7:=MAKELIST(0.0,X,1,f,1); print(); print("計算桁数="+digits+"桁 ("+k+"桁*"+(ARRYS)+")"); print("計算項数 "+f); print("計算削減数 "+e); s:=TICKS; FOR i FROM 1 TO f DO L7(i) := floor(base / 5) ; END; cy := 0 ; n := f ; FOR i FROM 1 TO ARRYS DO temp := 0 ; FOR j FROM n-1 DOWNTO 1 DO denom := 2 * j - 1 ; w := temp * j + L7(j) * base ; temp := floor(w / denom) ; L7(j) := w - temp * denom ; END; w := floor( temp / base) ; L6(i) := cy + w ; cy := temp - w * base ; n := n-e ; IF (TICKS>skip+100) THEN skip:=TICKS; TEXTOUT_P("残り計算項数="+n+" ", 0, 80,0,#0,160,#FFFFFF); t:=TICKS-s; TEXTOUT_P("経過時間: "+t/1000+"秒",0,110,0,#0,160,#FFFFFF); END; END; // 補正 cy := 0; FOR i FROM ARRYS DOWNTO 1 DO w := L6(i)+cy; cy := floor(w/base); L6(i) := w-cy*base; END; t:=TICKS; print("計算時間: "+(t-s)/1000+"秒"); print("PI=3."); IF k>1 THEN // 10桁整形 str1 := mid(string(L6(1)),2,10); ELSE str1 := ""; END; FOR i FROM 2 TO ARRYS DO str0 := string(L6(i)); WHILE dim(str0)=10 THEN str0 := str0+left(str1,10) + " "; str1 := mid(str1,11); ELSE str0 := str0+left(str1,digits-i); END; i := i+10; END; print(str0); END;