作者: Naomasa Numajiri
日時: 2002/5/21(18:58)
# カンニング場所
# http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/awk-function.html

昔数学で習ったことを思い出しながら書きました。

calculate()
    例えば2の平方根の場合
    * y = x^2 - 2とy=0の交点のx座標が求める値
    * 座標(a,a^2-2)で放物線に接する直線とy=0との交点のx座標は、
      aよりもより2の平方根に近い値となる。
    という考え方を使っています。
calculate_pi()
    四分円の中心に頂点がくる二等辺三角形を敷き詰める方法で求めています。
    三角関数の半角公式より、角度を半分にしたときの三角形の高さを求めてい
    ます。(半径を1に設定しているので三角形の高さはちょうどsinと同じ)

後者のアルゴリズムは、
再帰でやっていますが前の値が正確であることが前提なので、途中まで円周率に
近づき、だんだん離れて最後には0になります。。で、その後見つけたサイト
ではatan(1)を利用しているようです。
(やってることはよく分かりません。テイラー展開を使うのは知っているの
  ですが。。。)

# 平方根の求め方をはじめて知った時は結構感動しました。
# 何かの参考になれば。

でわでわ

-- ぬ

--^ calc.py
def calculate(number):
 old0 = 0.0; old1 = number
 arg0 = 0.0; arg1 = number
 while arg0 != old1:
  old1 = old0; old0 = arg0
  arg0 = arg1
  arg1 = (arg0+number/arg0)/2.0
 return arg1
def calculate_pi():
 high0 = 0.0
 high1 = 1.0
 count = 1
 while high1 != high0:
  high0 = high1
  high1 = calculate((1-calculate(1-high0*high0))/2)
  count += 1
  print 'high =',high1,'pi =',high1 * 2**count
 return high1 * 2**count

if __name__ == '__main__':
 for i in range(1,20):
  print i,'-->',calculate(i)
 calculate_pi()
--$