kotlin - 具有给定精度的 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)
正常。
有人可以就我做错了什么或为什么我必须除以eps
2 是否正确提供任何解释。
谢谢。
解决方案
该系列中的每一项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
推荐阅读
- c++ - 如何从小于特定值的向量中获取前 3 个值?
- c# - Exception.Cannot 打印异常字符串的问题,因为 Exception.ToString() 失败
- python - 如何在 Apple M1 芯片上导入 Pandas
- css - 如何为多个 React 项目添加通用样式表存储库?
- apache2 - 在 ubuntu 20.04 上使用 vsftpd / apache2 挣扎
- c++ - 飞船操作员的clang-tidy解析错误
- scroll - ElementScrolled 事件没有被 CdkScrollable 和 mat-side-nav 触发
- ionic-framework - html中的离子http数据为空
- java - IntelliJ 无法从功能文件中找到步骤定义
- c# - 下面代码的 linq 查询是什么?