近似式
円周率を求める式の研究は古来から盛んです。今からでも遅くはなく、収束が速い簡潔な式を見つければ、歴史に名を留めるかも知れません。今回は、今でも円周率の計算に使われるマチンの公式を使ってみます。
収束が速い
マチンの公式はとにかく、収束の速い式です。プログラミングは「マチンの公式」ウィキペデア《マチンの公式による計算》を参考にさせて頂きました。arctan(1/5)とarctan(1/239)において、両者の偏角値に開きがあり、計算する項数を調整しています。
小数点以下、14桁まで、多くの算出法と同じ値が得られました。ひところ、算出桁数を競った時期があり、2016年に22.4兆桁の記録があります。
サンプルコード
<div id="pic0" style="width:580px; height:265px;"> <img src="https://aidesign.lolipop.jp/wp-content/uploads/2017/06/MachinFormula.png"></div> <script type="text/javascript" charset="Shift_JIS"> const c5_239 = [0.2, 1/239]; const multiple = [16, 4]; var s = "マチンの公式を用いて円周率を算出<BR>" document.write(s); for(var j=0; j<=9; ++j){ var u = arctan(j, 0) - arctan(j, 1); s = "m="+j+" 項数="+("0"+(4*j+4)).slice(-2)+" PI="+u+"<BR>"; document.write(s); /* 円周率を計算・出力 */ } function arctan(m, num){ // 逆正接を求める var v = 0; var s = 1; var w = num * 4; // 0, 1 ---> 0, 4 c = c5_239[num]; for(var n=1; n<=(6-w)*m+5-w; n+=2){ // 0:6*m+5, 1:2*m+1 var g = Math.pow(c, n); v += s * g / n; s = -s; //console.log("N="+n+" V="+v+" G="+g); } v *= multiple[num]; return v; } </script> </html>
実行結果
余談
document.write()の引数に式を指定すると文法エラーになり困りました。直前に変数に代入し、その変数を引数にすればエラーになりません。>