为什么小于 1 的最大 IEEE 浮点可表示数与 1 相差半个机器 epsilon?

Why does the greatest IEEE floating point representable number smaller than 1 differ from 1 by half a machine epsilon?

我们可以将 1.0 表示为 2^0 x 1.0,将小于 1.0 的最大可表示数表示为 k,其中 k = 2^0 x 0.111.......1 被截断以适合。

那么 1.0 的差值或 ulp - k = 2^0 x 0.00000.....1.

这不是和机器epsilon一样吗,我们有 否 epsilon = 2^0 x 1.000000....1 - 2^0 x 1.000 = 2^0 x 0.000.....1?

为什么正确值是一半?

此外,对于 1.0 以外的值,如何计算 ulp?

有限浮点数表示为符号(+或-),固定数n+1位d0, d−1, d−2, dn,在一些基数 b 和指数 e 中,这样表示的数字是 sign d0.d−1d−2…dn×be。对于这个答案,我们取符号为 +,b 为 2.

用这种表示法:

  • 1 是 +1.00…0 × 20.
  • 下一个大于 1 的数字是 +1.00…1 × 20。由于dn位加1,所以超过1 20−n.
  • 下一个小于1的数是+1.11…1 × 2−1。请注意指数下降。这意味着它的 dn 位实际上具有值 2−1−n。所以它与 1 的区别仅在于 2−1−n 而不是 20−n.

对于任何正常的浮点数,ULP是ben 。然而,在浮点格式的下限附近,IEEE 754 有次正规数,ULP 被限制在 bemin 的值n.