読者です 読者をやめる 読者になる 読者になる

Panda Noir

JavaScript の限界を究めるブログです。

円周率を求める方法

自力で考え出した方法です。だいたい10回の施行で3.141592まで当てました どうでもいいですが7月22日は22/7が円周率に近似するため円周率の日というらしいです。

使った手法は高校で出てくる lim ( n to 0) sinx/x === 1というものです。

まず斜辺の長さが1の直角二等辺三角形を用意します。そして、この三角形の直角でない角の一つをひたすら二等分していきます。角の二等分線は下ろした辺を残りの辺の比で内分する性質(確か正確には辺の延長線と当たる時は外分となりますが)があるのでそれを使いsinxを求めます。どんどん求めていくとsinxはxに近づいていく(xの値は施行するごとに二等分されていく)のでラジアンであるxを利用して円周率を求めます。

本当はガウス=ルジャンドルアルゴリズムの証明するつもりだったのですが、10回の施行でそこそこの精度が出るアルゴリズム作れたので満足です。

a = [1]
b = [1 / Math.sqrt(2)]
c = 1 / Math.sqrt(2)
N = 10
for(var n = 0; n < N; n = (n + 1) | 0) {
    b[n+1] = b[n]*(c/(a[n]+c))
    a[n+1] = Math.sqrt(1/2+b[n+1]*b[n+1])
}
alert(b[n]/a[n]*Math.pow(2,n-1)*8)//円周率