十進BASICとマチンの公式を用いて円周率πを100桁求める [数値解析]
十進BASICとマチンの公式を用いて円周率πを100桁求める
円周率πの近似値を100桁求めたところで何の役にも立たないけれど、十進BASICを使って、πの近似値を100桁求めてみた。
計算結果は次の通り。
Π=3.
14159 26535 89793 23846 26433 83279 50288 41971 69399 37510
58209 74944 59230 78164 06286 20899 86280 34825 34211 70679
82148 08651
すこし余分を見て、110桁まで表示してある。
この計算に使用したプログラムは次の通り。
REM Machiの公式を用いたπの近似計算
OPTION ARITHMETIC DECIMAL_HIGH
LET n=100
LET S=0
LET FMT$="#."&REPEAT$("#",110)
PRINT USING fmt$
FOR k=1 TO n
LET A=(-1)^(k-1)/(2*k-1)
LET B = 4/5^(2*k-1)
LET C = 1./239^(2*k-1)
LET S = S + 4*A*(B-C)
NEXT k
PRINT USING fmt$:s
END
これをプログラムと呼ぶのが恥ずかしい。
計算効率も悪いし・・・。
プログラムのわかりやすさ(可読性)を重視したということで、この点は大目に見てもらおう。
これくらいの計算回数ならば計算速度は問題にならないけれど、計算速度を重視するならば、FOR NEXTループのべき乗計算は絶対に避けるべき。
たとえば、
このべき乗計算は
という漸化式に書き換えることができる。
だから、たとえば、次のように書き換えたほうがいいと思うにゃ。
REM Machiの公式を用いたπの近似計算
OPTION ARITHMETIC DECIMAL_HIGH
LET N=100
LET S=0
LET S5=1/(5*5)
LET S239=1/(239*239)
LET f=1
LET B=1/5
LET C=1/239
FOR K=1 TO N
LET A=f/(2*k-1)
LET S = S + A*(16*B-4*C)
LET f=-f
LET B = S5*B
LET C = S239*C
NEXT k
LET FMT$="#."&REPEAT$("#",110)
PRINT USING fmt$
PRINT USING fmt$:S
END
FOR NEXTループの反復回数nを100万くらいすると、おそらく、計算速度の違いを体感できると思う。
このプログラムを使って、1000桁まで計算をしてみたのだが、996桁目の値が異なってしまった。十進BASICの1000桁の精度を誇る、計算拡張モードを使ったのだけれど、このあたりが十進BASICで計算できる円周率πの限界のようだ。
コメント 0