円周率はロマン

いつだったか、円周率を手で計算できないものかと思ってたものの、そんな事忘れて大人になってしまった訳で。

最近になって何となく内部的な計算方法が気になり出して、調べてみたら面白くなっちゃって書いてみた。



http://gimite.net/rails/iframe_gadget


そもそもバカデカい桁の計算をさせるには多倍長演算とかいう、長い配列を使って計算させないといけない。

今回は情報が多かったのもあり、万進法を使用。

Ex)
123456789 + 123456789

なら、

Array[2] = 6789 + 6789
Array[1] = 2345 + 2345 + 1  // 桁上がり分
Array[0] = 1 + 1

みたいな。


配列1つに4桁ずつ埋めるので、円周率なら、

求める小数点以下の桁数 / 4 + 1(小数点以上) + 余裕分

が必要。余裕分は桁上がりなど誤差を考えて。


円周率の公式(マチンの公式)は

π/4 = 4arctan(1/5) - arctan(1/239)

証明等は他者様にお任せして・・・、これをテイラー展開すると、等比級数の形にできるので、ループを回して計算できる様になる。


正直、頭が硬くなってしまったからかlogの使い方なんて忘れてるが、ループを何回回せばいいのか問題は、logを使えば分かる。

分母がデカい程収束が速いので、そういう公式を選んだ方が基本的に速い(色々試した結果、自分の環境だとストーマーの式が速かった)。


また、forループなりで回した方が速いが、15秒制限に引っかかってデカい桁計算できないので、エンターフレームで回している。

stage.frameRate = 1000 とかやっているんだけど、ブラウザによって速度が違う。

恐らく、

フレームレートの最大値について話すと、Internet Explorerの最大値は100 flame/sec です。なぜならWindowsのタイマーの最小値が10ミリ秒だからです(1秒(1000ミリ秒)÷10ミリ秒=100 flame/sec)。FireFoxはどうでしょうか?FireFoxは特別なタイマーを持たず、プラグインによってタイマーの最小値が決まっていません。これは思うに、プラグインがCPU timeをとりすぎることに対し、ユーザーが不満を漏らしていたためでしょう。

trick7 - Flash Playerのフレームレート
http://www.trick7.com/blog/2006/05/09-101745.php

という事っぽい?

まぁ速度を求めるならフーリエ変換とか使って計算するらしいし、そもそもActionScriptで(ry


それでも、計算できる部分を先に計算しておけば、まだ速度アップできそう。