円周率計算プログラム(double精度まで)
スレッド関連の実験コードを書く際に、それなりに時間のかかる処理が欲しくて
sleepを使うのではなく、実際にある程度時間のかかる処理を実装しようと思い
円周率の計算ならそこそこ処理掛かりそうだと言うことで、以下の3つ(+1)の公式を調べて実装してみました。
1. ライプニッツの公式
2. 海外で実装例をよく見かけた ニーラカンタの公式
3. 円周率解析プログラムでも使われたりする ラマヌジャンの公式
4. 出処忘却 ソースコードだけ見つけてメモしたまま元の文献を忘れてしまったやつ
以下ソースコード
公式が単純なので簡単にコードにできます。
ただ、収束率が悪く、 num_steps = 1000 程度では精度はかなり悪いです。
ニーラカンタの公式
英語で円周率計算に関するプログラムとか探してるとわりと出てきます。
ライプニッツの公式よりは収束率は良いです。
ソースコードはよく見かけるのですが、公式に関する情報が英語、日本語ともに全然見つけられませんでした。
現在でも円周率計算で使われたりするアルゴリズム。
収束率はかなり良いです。
num_steps = 2くらいでdoubleくらいの精度なら出てしまいます。
ただ、num_steps = 50くらいにすると、計算にdoubleの精度じゃ足りなくなってnanになってしまいます。
double程度の精度ではnum_steps = 2以上にする意味はほぼありません。
すごい。
出処忘却
昔、円周率計算のプログラムを調べた際にソースコードのコピペだけして
コピー元のURLとかを全くメモしていなかったため、どこで見つけたのか思い出せませんでした。
ただ、こういう方法もあるのかということでおまけで載せておきます。
単純に処理負荷がそこそこかかるコードがほしい。
そんでもってなんとなく意味あることしてそうなコードになっててほしい。
そんなときは円周率計算をライプニッツの公式で実装してn=500万くらいにするとそこそこの精度と処理負荷が得られそうです。
参考
π:Never Ending Number~ラマヌジャンのMysteriousな公式~
wikipedia に円周率の近似についてのページが有りました。