c++ - float 的指数偏差有规范吗?

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

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++ 没有定义偏差,您不需要知道它就可以使用 frexpilogblogb。这些函数都使用并返回一个数学指数,而不是有偏差的指数。 (然而,对于 frexp,指数被缩放使得有效数在 [1/2, 1) 而不是 IEEE-754 通常的 [1, 2]。)1

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

注意事项

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

关于c++ - float 的指数偏差有规范吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50118504/

相关文章:

c++ - 方法最开始的段错误

python - int() 和 float() 的行为不一致

c++ - C++中的截断

c++ - For 循环中奇怪的 LLVM 无符号到有符号转换

c++ - 如何初始化可变长度的无符号字符数组?

c++ - 删除 QWidget 周围的额外间距

c++将结构保存到文件中

c++ - C++中while()循环的不理解

javascript - AngularJS 将字符串数组转换为 float 组

C unsigned int 比较 - 环绕自定义位数