用Scheme中的Leibniz公式编写程序以近似pi?

时间:2013-03-25 20:00:15

标签: math scheme pi

我正试图弄清楚如何使用Leibniz公式编写程序以近似pi。该函数采用错误E,并以某种方式给出pi近似值。

我根本不确定如何做到这一点。我开始编写辅助函数,但不知道要放入什么。有什么帮助吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

除非使用某种收敛加速技术,否则Leibniz公式是计算π的一种相当低效的方法。根据{{​​3}},使用系列的直接求和计算π到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

作为参考,在Wikipedia问题中,Leibniz的公式有几个很短的实​​现 - 包括this中的一个。

答案 1 :(得分:0)

Leibniz formula for PI是一个总和。该函数将递增n,直到n的summand小于E.

(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))))))