首页 > 解决方案 > 具有给定精度的 Pi 的莱布尼茨公式

问题描述

我被要求使用 Leibniz 公式以给定的精度 ( ) 计算 Pi 数eps

公式如下所示:

在此处输入图像描述

最初,我编写了以下代码:

fun main() {
    val eps = 0.005
    var n = 2
    var r = row(n) // current row
    var r0 = row(n-1)
    var s = r0 + r
    
    while (Math.abs(r) > eps) {
        n++
        r = row(n)
        s += r
    }
    println(r.toString() + " <-- Leibniz(" + n.toString() + ")")
    println(Math.abs(s*4).toString() + " <-- our evaluation with eps")
    println(Math.PI.toString() + " <-- real Pi")
    println((Math.abs(s*4)) in (Math.PI-eps..Math.PI+eps))
}

fun row(n: Int) = ((Math.pow(-1.0, n.toDouble()))/(2*n-1))

然后我发现它不能正常工作,因为 println((Math.abs(s*4)) in (Math.PI-eps..Math.PI+eps))print false.

我更深入,进行了调试,并意识到如果
while (Math.abs(r) > eps/2)
一切
while (Math.abs(r) > eps)
正常。

有人可以就我做错了什么或为什么我必须除以eps2 是否正确提供任何解释。

谢谢。

标签: kotlinmath

解决方案


该系列中的每一项r_i都以 4 的系数汇总为 PI,因为sum(r_0, .., r_n) = PI/4. 因此,当然,当您停在第一个位置时r_i <= eps,这仅意味着sum(r_0, ..., r_(i-1))准确度为eps,即介于两者之间[PI/4 - eps/2, PI/4 + eps/2]。但是 PI 它本身就是4*sum因此精度当然是,4*eps即近似值介于两者之间[PI-2*eps ,PI+2*eps]

对于您的价值eps = 0.005

  • 第一个r_100 = 0.00497512...是第一个r <= eps
  • sum(r0, ..., r_99) = 0.782829,因此此时的 PI 将近似为3.1315929

编辑

此外,您实际上是在计算-PI,因为正在翻转系列中每个术语的符号。因此,您r0在代码中调用的内容(它应该被调用r1,因为它是 的结果row(1)-1而不是+1


推荐阅读