π(円周率)の近似を計算してみた

サイモン・シンフェルマーの最終定理を読んでたらπ(円周率)の近似を求める話がなんかの例として出ていた。

π = 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しなくてもあんまり変らないようだった。なんでだろ。

フェルマーの最終定理 (新潮文庫)

フェルマーの最終定理 (新潮文庫)