4

有人说双精度浮点数的机器 epsilon 是 2^-53,而其他人(更常见)说它的 2^-52。我已经搞砸了使用除 1 之外的整数和从上方和下方接近(在 matlab 中)来估计机器精度,并且得到了两个值作为结果。为什么在实践中可以观察到这两个值?我认为它应该总是在 2^-52 左右产生一个 epsilon。

4

3 回答 3

7

术语“机器 epsilon”存在固有的歧义,因此要解决此问题,通常将其定义为1与下一个更大的可表示数字之间的差异。(这个数字实际上(而不是偶然)是通过将二进制表示逐字递增一来获得的。)

IEEE754 64 位浮点数有 52 个显式尾数位,因此 53 包括隐式前导1. 所以两个连续的数字是:

1.0000  .....  0000
1.0000  .....  0001
  \-- 52 digits --/

所以两者之间的差异是 2 -52

于 2011-11-03T13:06:55.053 回答
2

这取决于你采用哪种方式。

1 + 2^-53恰好在1和之间1 + 2^-52,它们在双精度浮点中是连续的。因此,如果将其四舍五入,则与 1 不同;如果向下取整,则等于 1。

于 2011-11-03T13:05:30.733 回答
1

实际上,“机器精度”有两个定义,乍一看听起来完全一样,但实际上并非如此,因为它们为“机器 epsilon”产生了不同的值:

  1. 机器 epsilon 是最小的浮点数eps1,使得1.0 + x > 1.0.
  2. 机器 epsilon 是与eps2 = x - 1.0x最小可表示浮点数的差x > 1.0

严格来说,这些定义是等价的,即eps1 == eps2,但我们在这里讨论的不是数,而是浮点数。这意味着隐式舍入和取消,这意味着eps2 == 2 * eps2(至少在使用 IEEE-754 浮点数的最常见架构中)。

更详细地说,如果我们让一些x0.0到某个点 where ,则在(根据定义 1)1.0 + x > 1.0到达该点。x == eps1但是,由于 roundup,结果1.0 + eps1不是,而是下一个 大于1.0 + eps11.0 的可表示浮点值——即(根据定义 2)。所以,本质上,eps2

eps2 == (1.0 + eps1) - 1.0

(数学家会对此感到畏缩。)由于四舍五入的行为,这意味着

eps2 == eps1 * 2 (approximatively)

这就是为什么“机器 epsilon”有两种定义,合法且正确的原因。

就个人而言,我发现eps2更“稳健”的定义,因为它不依赖于实际的舍入行为,只依赖于表示,但我不会说它比另一个更正确。与往常一样,这一切都取决于上下文。在谈论“机器epsilon”时要清楚您使用的定义,以防止混淆和错误。

于 2015-02-27T05:19:18.390 回答