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 件のコメント:
コメントを投稿