IEEE 浮点数舍入

IEEE Floating Point Number Rounding

对于 IEEE 浮点数,为什么它们等于 epsilon m?

(1 - 1e-16) - 1 ans = -1.1102e-16

1 + (1e-16 - 1) ans = 1.1102e-16

而另一方面,低于等于 0

(1 + 1e-16) - 1 ans = 0

谁能给我解释一下为什么?对于最后一个,我明白了 fl(x) = 1 对于 1 ≤ x ≤ 1 + M 和 fl(x) = 1 + 2M 对于 1 + M < x ≤ 1 + 2M

前两个不应该等于 0 因为 fl(x) = 1 对于 1 - M < x ≤ 1 和 fl(x) = 1 - 2M 对于 1 - 2M ≤ x ≤ 1 - M ?

Machine epsilon 并不是一个真正定义明确的术语,因为不同的来源和语言以不同的方式定义它。

如果我们取M为2-53≈ 1.11 × 10-16(即1和上一个浮点数的差距,或者1和下一个浮点数差距的一半) 然后 1 附近的浮点数线看起来像:

--|----|----|----|---------|---------|------
     1-2M  1-M   1        1+2M      1+4M

因此,在标准舍入到最近的情况下,关系到偶数,我们有

  • fl(x) = 1-M 对于 1 - 3M/2 < x < 1 - M/2
  • fl(x) = 1 对于 1 - M/2 ≤ x ≤ 1 + M
  • fl(x) = 1+2M 对于 1 + M < x < 1 + 3M

所以在第一种情况下,1 - 1e-16 会四舍五入为 1 - M,在第二种情况下 1 + 1e-16 会四舍五入为 1