日別アーカイブ: 2017-06-30

マチンの公式で円周率

近似式

円周率を求める式の研究は古来から盛んです。今からでも遅くはなく、収束が速い簡潔な式を見つければ、歴史に名を留めるかも知れません。今回は、今でも円周率の計算に使われるマチンの公式を使ってみます。

収束が速い

マチンの公式はとにかく、収束の速い式です。プログラミングは「マチンの公式」ウィキペデア《マチンの公式による計算》を参考にさせて頂きました。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()の引数に式を指定すると文法エラーになり困りました。直前に変数に代入し、その変数を引数にすればエラーになりません。