指数偏差似乎始终等于 numeric_limits<T>::max_exponent - 1
其中 T
是浮点型。
但是,我没有任何文档表明这总是正确的,而且我当然对非 IEEE 浮点格式一无所知。
这必须是众所周知的功能,例如:
是否c++有它的规范,或者我必须假设 numeric_limits<T>::max_exponent - 1
?
最佳答案
C++ 没有定义偏差,您不需要知道它就可以使用 frexp
、ilogb
或 logb
。这些函数都使用并返回一个数学指数,而不是有偏差的指数。 (然而,对于 frexp
,指数被缩放使得有效数在 [1/2, 1) 而不是 IEEE-754 通常的 [1, 2]。)1
只有在修改 float 的内部表示时才需要偏差,在这种情况下,您的代码是依赖于实现的。 IEEE-754 将偏差定义为 2k−p−1−1,其中 k 是存储以位为单位的宽度(例如 32 或 64),p 是以位为单位的精度(数学有效位数中的位数,例如常见的 float
为 24 或 53和 double
类型,它比包含有效数字的主要编码的字段的宽度多一个)。因此,对于常见的 32 位格式,偏差为 232−24−1−1 = 27−1 = 127。C++ 实现可能使用非 IEEE -754 种格式。
注意事项
1 如果 frexp
和 ilogb
/logb
的指数不同,那么说它是什么意思是数学还是有偏见?显然有一些基点是相对于指数测量的,那么它怎么可能是无偏的呢?对于 frexp
、ilogb
或 logb
,每个函数的结果仅取决于数字的值。无论您使用 frex
的 float
还是 double
变体,您都会得到相同的结果。只有数学值很重要。相反,当您查看浮点值的内部表示时,指数将根据数据的格式而有所不同; float
与 double
有不同的偏差。
关于c++ - float 的指数偏差有规范吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50118504/