1

我试图弄清楚如何编写一个程序来用莱布尼茨公式逼近 pi。该函数接受一个误差 E,并以某种方式给出 pi 近似值。

我完全不确定该怎么做。我开始编写一个辅助函数,但不知道该放什么。有什么帮助吗?

谢谢!

4

2 回答 2

1

除非使用某种收敛加速技术,否则莱布尼茨公式是计算 π 的一种相当低效的方法。根据维基百科,使用级数的直接求和计算 π 到 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

作为参考,在这个问题中,莱布尼茨公式有几个非常简短的实现——包括Scheme中的一个。

于 2013-03-26T00:52:43.700 回答
0

PI的莱布尼茨公式是一个求和。该函数将递增 n,直到 n 的和小于 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))))))
于 2013-03-25T20:15:52.310 回答