【问题标题】:Is there a specification for a floating point’s exponent bias?是否有浮点指数偏差的规范?
【发布时间】:2018-10-11 14:39:38
【问题描述】:
【问题讨论】:
标签:
c++
c++
floating-point
unsigned
exponent
numeric-limits
【解决方案1】:
C++ 没有定义偏差,您无需知道它即可使用frexp、ilogb 或logb。这些函数都使用并返回一个数学指数,而不是一个有偏的指数。 (但是,对于 frexp,指数被缩放,使得有效数字在 [1/2, 1) 中,而不是 IEEE-754 通常的 [1, 2)。)1
只有在修改浮点数的内部表示时才需要偏差,在这种情况下,您的代码是依赖于实现的。 IEEE-754 将偏差定义为 2k-p-1-1,其中 k 是存储以位为单位的宽度(例如 32 或 64),p 是以位为单位的精度(数学有效数中的位数,例如常见的 float 和 double 类型的 24 或 53 ,它比包含有效数字的主要编码的字段的宽度大一)。因此,对于常见的 32 位格式,偏差为 232-24-1-1 = 27-1 = 127。C++ 实现可能使用非 IEEE -754 种格式。
注意
1 如果frexp 和ilogb/logb 的指数不同,那么说它是数学的或有偏差的是什么意思?显然有一些相对于测量指数的基点,那么它怎么能是无偏的呢?对于frexp、ilogb 或logb,每个函数的结果仅取决于数字的值。无论您使用frexp 的float 或double 变体,您都会得到相同的结果。只有数学值很重要。相反,当您查看浮点值的内部表示时,指数会根据数据的格式而有所不同; float 与 double 有不同的偏见。
【解决方案2】:
我想你必须在这里做一个假设。
特别是,is_iec559 可能是 false,在这种情况下,指数可能(但不太可能)以完全不同的方式表示(例如,作为 2 的补码而不是有偏整数)。
但是,指数的不同表示确实不太可能。即使是 VAX 和 IBM 大型机格式,虽然在其他方面与 IEEE 明显不同,但它们的指数仍然使用超 N 格式。