浮点数的指数偏差有规范吗?

Is there a specification for a floating point’s exponent bias?

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

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

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

指数的不同表示法确实不太可能。即使是 VAX 和 IBM 大型机格式,尽管在其他方面与 IEEE 截然不同,但它们的指数仍然使用 excess-N 格式。

C++ 没有定义偏差,您不需要知道它就可以使用 frexpilogblogb。这些函数都使用 return 数学指数,而不是有偏差的指数。 (然而,对于 frexp,指数被缩放,使得尾数在 [1/2, 1) 而不是 IEEE-754 通常的 [1, 2]。)1

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

备注

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