EXPORT PI_CALC_B() BEGIN LOCAL digits=1000 ; // 計算する桁数 LOCAL k := 8 ; // 変数あたりの桁数 INPUT(digits,"計算桁数","digits=","計算する桁数",1000,100); INPUT(k,"変数あたりの桁数","base=","変数の桁数",8,8); LOCAL base := 10^k ; // 基底 LOCAL ARRYS := floor((digits+k-1)/k)+1; // 配列数 LOCAL f := floor(digits/log(2))+1 ; // 計算項数 LOCAL i, n, g, w, cy, s, t; LOCAL skip:=0; LOCAL str0, str1; // 配列 初期化 L4:=MAKELIST(0.0,X,1,ARRYS,1); print(); print("計算桁数="+digits+"桁 ("+(k)+"桁*"+(ARRYS)+")"); print("計算項数 "+f); s:=TICKS; FOR n FROM f DOWNTO 1 DO cy := 0; FOR i FROM ARRYS DOWNTO 1 DO // A * n -> A w := L4(i)*n+cy; cy := floor(w/base); L4(i) := w-cy*base; END; // A / (n*2+1) -> A g := n*2+1; FOR i FROM 1 TO ARRYS DO t := cy*base+L4(i); w := floor(t / g); cy := t - w*g; L4(i) := w; END; // A + 2 -> A L4(1) := L4(1)+2; IF (TICKS>skip+100) THEN skip:=TICKS; TEXTOUT_P("残りループ数="+n+" ", 0, 70,0,#0,160,#FFFFFF); t:=TICKS-s; TEXTOUT_P("経過時間: "+t/1000+"秒",0,100,0,#0,160,#FFFFFF); END; END; t:=TICKS; print("計算時間: "+(t-s)/1000+"秒"); print("PI=3."); str1 := ""; // 10桁整形 FOR i FROM 2 TO ARRYS DO str0 := string(L4(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;