2010年1月23日土曜日

マクローリン展開でsin関数

元ネタは上記リンクから。
Common Lispで、デフォルトで10項までの和、としています。
さすが収束率が良いのか、結構良い精度では、とか思います。

;; お馴染み階乗関数
(defun fact (x &optional (acc 1))
(if (zerop x)
acc
(fact (1- x) (* x acc))))

(defun mc-sin (x &optional (n 10) (acc 0))
;; flet でローカル関数 rec を束縛
(flet ((rec (n)
(let ((m (+ 1 (* 2 n))))
(/ (* (expt -1 n) (expt x m))
(fact m)))))
;; 後は再帰
(if (< n 0)
acc
(mc-sin x (1- n) (+ (rec n) acc)))))

実行結果は以下の通り。

CL-USER> (mc-sin 0)
0
CL-USER> (mc-sin (/ pi 6))
0.49999999999999994d0
CL-USER> (mc-sin (/ pi 2))
1.0d0
CL-USER>

Common Lispの組み込み関数のsinもこんな感じですからね。

CL-USER> (sin 0)
0.0
CL-USER> (sin (/ pi 6))
0.49999999999999994d0
CL-USER> (sin (/ pi 2))
1.0d0
CL-USER>

まあ、こんなモンでしょう。

0 件のコメント:

コメントを投稿