ライプニッツの公式で円周率を近似するプログラムを作成する方法を理解しようとしています。この関数は誤差Eを取り、どういうわけかpi近似を与えます。
これを行う方法がまったくわかりません。ヘルパー関数を書き始めましたが、何を入れるべきかわかりませんでした。何か助けはありますか?
ありがとう!
ライプニッツの公式は、ある種の収束加速法を使用しない限り、πを計算するためのかなり非効率的な方法です。ウィキペディアによると、級数の直接合計を使用して円周率を小数点以下10桁まで計算するには、約5,000,000,000項が必要です。
とにかく、これが数式の直接変換です-べき乗演算の削除を含む小さな最適化で、@GoZonerの実装よりもわずかに高速になります:
(define (leibniz err)
(let loop ((n 0)
(prev +nan.0)
(curr 0.0))
(if (<= (abs (- curr prev)) err)
(* 4 curr)
(loop (add1 n)
curr
((if (even? n) + -) curr (/ 1 (add1 (+ n n))))))))
この手順は、シリーズの現在の値と前の値の差が、提供されたエラー以下になるまで繰り返されます。エラーは小さい数である必要があります1e-6
。例えば:
(leibniz 1e-6)
=> 3.1415946535856922
PIのライプニッツの公式は総和です。この関数は、nの被加数がEより小さくなるまでnをインクリメントします。
(define (leibniz err)
(define (summand n)
(/ (expt -1 n) (+ (* 2.0 n) 1)))
(let summing ((result 0) (n 0))
(let ((increment (summand n)))
(if (< (abs increment) err)
(* 4 (+ result increment))
(summing (+ result increment) (+ n 1))))))