Jon*_*Mee 5 c++ floating-point unsigned exponent numeric-limits
IEEE浮点指数存储为无符号整数,使用预定义的指数偏差来抵消指数.
该指数偏见似乎始终等于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\xe2\x80\x99 中通常的 [1, 2)。)1
仅当您修改浮点数的内部表示时才需要偏差,在这种情况下您的代码是依赖于实现的。IEEE-754 将偏差定义为 2 k \xe2\x88\x92 p \xe2\x88\x921 \xe2\x88\x921,其中k是以位为单位的存储宽度(例如 32 或 64),p是精度以位为单位(数学有效数中的位数,例如公共float和double类型的位数为 24 或 53,比包含有效数的主要编码的字段的宽度多 1)。因此,对于常见的 32 位格式,偏差为 2 32\xe2\x88\x9224\xe2\x88\x921 \xe2\x88\x921 = 2 7 \xe2\x88\x921 = 127。C++ 实现可以使用非-IEEE-754 格式。
1frexp如果和ilogb/ 的指数不同logb,那么说它是数学的或有偏差的意味着什么?显然,指数的测量是有某个基点的,那么它怎么可能是无偏的呢?对于frexp、ilogb或logb,每个函数的结果仅取决于数字的值。无论您是否使用float或 的double变体,您都会得到相同的结果frexp。只有数学值才重要。相反,当您查看浮点值的内部表示时,指数将根据数据格式而有所不同;float有不同的偏见double。