【问题标题】:Is there a specification for a floating point’s exponent bias?是否有浮点指数偏差的规范?
【发布时间】:2018-10-11 14:39:38
【问题描述】:

IEEE floating point exponents are stored as unsigned integers, using a pre-defined exponent bias to offset the exponent.

指数偏差似乎始终等于numeric_limits<T>::max_exponent - 1,其中T 是浮点类型。

但是,我没有任何文档说明这始终是正确的,而且我当然对非 IEEE 浮点格式一无所知。

这对于以下功能必须是已知的:

是否有它的规范,还是我必须假设 numeric_limits<T>::max_exponent - 1

【问题讨论】:

    标签: c++ c++ floating-point unsigned exponent numeric-limits


    【解决方案1】:

    C++ 没有定义偏差,您无需知道它即可使用frexpilogblogb。这些函数都使用并返回一个数学指数,而不是一个有偏的指数。 (但是,对于 frexp,指数被缩放,使得有效数字在 [1/2, 1) 中,而不是 IEEE-754 通常的 [1, 2)。)1

    只有在修改浮点数的内部表示时才需要偏差,在这种情况下,您的代码是依赖于实现的。 IEEE-754 将偏差定义为 2k-p-1-1,其中 k 是存储以位为单位的宽度(例如 32 或 64),p 是以位为单位的精度(数学有效数中的位数,例如常见的 floatdouble 类型的 24 或 53 ,它比包含有效数字的主要编码的字段的宽度大一)。因此,对于常见的 32 位格式,偏差为 232-24-1-1 = 27-1 = 127。C++ 实现可能使用非 IEEE -754 种格式。

    注意

    1 如果frexpilogb/logb 的指数不同,那么说它是数学的或有偏差的是什么意思?显然有一些相对于测量指数的基点,那么它怎么能是无偏的呢?对于frexpilogblogb,每个函数的结果仅取决于数字的。无论您使用frexpfloatdouble 变体,您都会得到相同的结果。只有数学值很重要。相反,当您查看浮点值的内部表示时,指数会根据数据的格式而有所不同; floatdouble 有不同的偏见。

    【讨论】:

      【解决方案2】:

      我想你必须在这里做一个假设。

      特别是,is_iec559 可能是 false,在这种情况下,指数可能(但不太可能)以完全不同的方式表示(例如,作为 2 的补码而不是有偏整数)。

      但是,指数的不同表示确实不太可能。即使是 VAX 和 IBM 大型机格式,虽然在其他方面与 IEEE 明显不同,但它们的指数仍然使用超 N 格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        相关资源
        最近更新 更多