π(円周率)の近似を計算してみた
サイモン・シンのフェルマーの最終定理を読んでたらπ(円周率)の近似を求める話がなんかの例として出ていた。
π = 4 * (1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 …)
と言う計算をずっとやっていくと近似値を求められるそうだ。
<追記 2008/12/15>
どうしてこの計算で求められるのかという理屈は何かというと以下の動画で説明している内容のようだ。
http://jp.youtube.com/watch?v=c7rUr77gtO4(via http://d.hatena.ne.jp/satoshis/20081215/p1)
上の式を一般化すると
π = 4 * (1/(2*1-1) - 1/(2*2-1) + 1/(2*3-1) - 1/(2*4-1) ・・・ 1/(2*n-1)) [n>0 かつ整数]
となるので、数学苦手な自分にもできそうと思ってやってみた。
calc_pi.rb
#!/usr/bin/ruby require 'mathn' def inner_pi(n) num = 1.0 / (n * 2 - 1) if n % 2 == 0 return num * -1 else return num end end def pi(n) pi_num = 0 n.downto(1) do |i| pi_num += inner_pi(i) end pi_num * 4 end a = ARGV[0].to_i print "\n#{pi(a).to_f }\n"
実行結果
$ ./calc_pi.rb 100 3.13159290355855 $ ./calc_pi.rb 999 3.14259365434004 $ ./calc_pi.rb 9999 3.14169266359054 $ ./calc_pi.rb 99999 3.14160265368979 $ ./calc_pi.rb 999999 3.14159365359079
nの数を増やしていくとだんだんいい感じになってくる。
でもWikipediaによるとπの近似値は
π = 3.14159 26535 89793 23846 26433 83279 50288 …
ということだからまだまだ不正確なんだろうなあ。
こんなにたくさん計算しても小数点以下5桁がいいとこなのか。
ちなみにinner_piの中の割り算で切捨てが発生するような気がしたので、mathnをrequireして有理数を扱えるようにしたけれど、requireしなくてもあんまり変らないようだった。なんでだろ。
- 作者: サイモンシン,Simon Singh,青木薫
- 出版社/メーカー: 新潮社
- 発売日: 2006/05/30
- メディア: 文庫
- 購入: 105人 クリック: 1,697回
- この商品を含むブログ (575件) を見る