为什么小于 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, d−n,在一些基数 b 和指数 e 中,这样表示的数字是 sign d0.d−1d−2…d−n×be。对于这个答案,我们取符号为 +,b 为 2.
用这种表示法:
- 1 是 +1.00…0 × 20.
- 下一个大于 1 的数字是 +1.00…1 × 20。由于d−n位加1,所以超过1 20−n.
- 下一个小于1的数是+1.11…1 × 2−1。请注意指数下降。这意味着它的 d−n 位实际上具有值 2−1−n。所以它与 1 的区别仅在于 2−1−n 而不是 20−n.
对于任何正常的浮点数,ULP是be−n 。然而,在浮点格式的下限附近,IEEE 754 有次正规数,ULP 被限制在 bemin 的值−n.
我们可以将 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, d−n,在一些基数 b 和指数 e 中,这样表示的数字是 sign d0.d−1d−2…d−n×be。对于这个答案,我们取符号为 +,b 为 2.
用这种表示法:
- 1 是 +1.00…0 × 20.
- 下一个大于 1 的数字是 +1.00…1 × 20。由于d−n位加1,所以超过1 20−n.
- 下一个小于1的数是+1.11…1 × 2−1。请注意指数下降。这意味着它的 d−n 位实际上具有值 2−1−n。所以它与 1 的区别仅在于 2−1−n 而不是 20−n.
对于任何正常的浮点数,ULP是be−n 。然而,在浮点格式的下限附近,IEEE 754 有次正规数,ULP 被限制在 bemin 的值−n.