我理解sin(pi)
不等于0的原因是因为没有足够的位来存储“pi”的所有有效数字,但是呢与机器epsilon有关吗?
我在网上阅读什么是机器 epsilon,但在阅读了一个小时的不同措辞的定义后,我感到困惑并且不理解 epsilon 的概念。我最终对自己的愚蠢感到非常沮丧......
下面这个例子是在 MATLAB 文档中给出的,我不明白,有人可以向我解释这个例子试图展示什么吗?
Find the distance from 10.0 to the next largest double-precision number.
d = eps(10.0) d = 1.7764e-15
最佳答案
机器 epsilon 有几个不同的定义,但是 Matlab eps
非常典型,是 1.0 和下一个最大的 double float 之间的差距。
我们实际上可以更一般化:对于 2k ≤ x
< 2k+1 之间的任何 float ,间隙x
和下一个最大的 float 之间是 2k × eps
(即 Matlab 中的 eps(x)
).此外,任何实数与其最接近的 float 近似值之间的差距是这个数的一半。
因为 2 ≤ π < 4;,这意味着 pi
(数值近似值)和 π(精确的无理数)之间的差距以 eps
为界。事实上,它刚刚超过一半:
eps
≈ 2.22 × 10-16
|pi
- π| ≈ 1.22 × 10-16
现在使用@aka.nice 答案的结果,并且 sin(π) = 0,我们得到了
罪(圆周率
)= | sin(pi
) - sin(π) | ≈ |pi
- π| <eps
即它也受 eps
的限制。
注意:sin(pi)
(数字结果)和 sin(pi
)(精确结果)之间也有一些轻微的舍入,但这是order eps
2,所以在这种情况下可以忽略。
关于Matlab sin(pi) 及其与机器 epsilon 的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41584752/