有人说双精度浮点数的机器 epsilon 是 2^-53,而其他人(更常见)说它的 2^-52。我已经搞砸了使用除 1 之外的整数和从上方和下方接近(在 matlab 中)来估计机器精度,并且得到了两个值作为结果。为什么在实践中可以观察到这两个值?我认为它应该总是在 2^-52 左右产生一个 epsilon。
3 回答
术语“机器 epsilon”存在固有的歧义,因此要解决此问题,通常将其定义为1
与下一个更大的可表示数字之间的差异。(这个数字实际上(而不是偶然)是通过将二进制表示逐字递增一来获得的。)
IEEE754 64 位浮点数有 52 个显式尾数位,因此 53 包括隐式前导1
. 所以两个连续的数字是:
1.0000 ..... 0000
1.0000 ..... 0001
\-- 52 digits --/
所以两者之间的差异是 2 -52。
这取决于你采用哪种方式。
1 + 2^-53
恰好在1
和之间1 + 2^-52
,它们在双精度浮点中是连续的。因此,如果将其四舍五入,则与 1 不同;如果向下取整,则等于 1。
实际上,“机器精度”有两个定义,乍一看听起来完全一样,但实际上并非如此,因为它们为“机器 epsilon”产生了不同的值:
- 机器 epsilon 是最小的浮点数
eps1
,使得1.0 + x > 1.0
. - 机器 epsilon 是与
eps2 = x - 1.0
的x
最小可表示浮点数的差x > 1.0
。
严格来说,这些定义是等价的,即eps1 == eps2
,但我们在这里讨论的不是实数,而是浮点数。这意味着隐式舍入和取消,这意味着eps2 == 2 * eps2
(至少在使用 IEEE-754 浮点数的最常见架构中)。
更详细地说,如果我们让一些x
从0.0
到某个点 where ,则在(根据定义 1)1.0 + x > 1.0
到达该点。x == eps1
但是,由于 roundup,结果1.0 + eps1
不是,而是下一个 大于1.0 + eps1
1.0 的可表示浮点值——即(根据定义 2)。所以,本质上,eps2
eps2 == (1.0 + eps1) - 1.0
(数学家会对此感到畏缩。)由于四舍五入的行为,这意味着
eps2 == eps1 * 2 (approximatively)
这就是为什么“机器 epsilon”有两种定义,合法且正确的原因。
就个人而言,我发现eps2
更“稳健”的定义,因为它不依赖于实际的舍入行为,只依赖于表示,但我不会说它比另一个更正确。与往常一样,这一切都取决于上下文。在谈论“机器epsilon”时要清楚您使用的定义,以防止混淆和错误。