kotlin - 具有给定精度的Pi的Leibniz公式

标签 kotlin math

我被要求使用Leibniz公式以给定的精度(eps)计算Pi的Pi编号。
该公式如下所示:
enter image description here
最初,我编写了以下代码:

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))打印false
我更深入地进行了调试,并意识到如果while (Math.abs(r) > eps/2)过度while (Math.abs(r) > eps)一切正常。
有人可以提供关于我做错了什么或为什么我必须将eps除以2的任何解释(如果正确)。
谢谢。

最佳答案

由于r_i,该系列中的每个词sum(r_0, .., r_n) = PI/4都加起来等于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

    关于kotlin - 具有给定精度的Pi的Leibniz公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64589152/

    相关文章:

    java - 调用验证伴随对象方法的单元测试(模拟伴随对象)

    multithreading - 在 Kotlin 协程上运行阻塞的 CPU 绑定(bind)任务

    android - 通过Android后台服务Kotlin轮询在线打印机队列

    c++ - c 中的模运算符

    android - OpenGL ES 2.0/GLSL 不呈现数据 (Kotlin)

    android - 在 Android 发布版本中使用 Kotlin 反射 sealSubClasses 属性

    java - 按时间间隔计算日内烛台

    java - 用于绘制数学函数/方程式的简单 Java 库

    java - 为什么快速平方根反比在 Java 上如此奇怪和缓慢?

    algorithm - 长字符串的排列