IEEE 浮点指数存储为无符号整数,使用预定义的指数偏差来抵消指数。
指数偏差似乎始终等于浮点类型的位置numeric_limits<T>::max_exponent - 1
。T
但是,我没有任何文档说明这始终是正确的,而且我当然对非 IEEE 浮点格式一无所知。
这对于以下功能必须是已知的:
c++是否有它的规范,还是我必须假设numeric_limits<T>::max_exponent - 1
?
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 通常的 [1, 2)。)1
只有在修改浮点数的内部表示时才需要偏差,在这种情况下,您的代码是依赖于实现的。IEEE-754 将偏差定义为 2 k -<em>p-1 -1,其中k是以位为单位的存储宽度(例如 32 或 64),p是以位为单位的精度(数学中的位数)有效位,例如 24 或 53 表示普通float
和double
类型,它比包含有效位的主要编码的字段的宽度大一)。因此,对于常见的 32 位格式,偏差为 2 32-24-1 -1 = 2 7 -1 = 127。C++ 实现可以使用非 IEEE-754 格式。
1frexp
如果和ilogb
/的指数不同logb
,那么说它是数学的或有偏见的是什么意思?显然有一些相对于测量指数的基点,那么它怎么能是无偏的呢?对于frexp
、ilogb
或logb
,每个函数的结果仅取决于数字的值。无论您使用float
或的double
变体,您都会得到相同的结果frexp
。只有数学值很重要。相反,当您查看浮点值的内部表示时,指数会因数据格式而异;float
有不同的偏见double
。
我想你必须在这里做一个假设。
特别是,is_iec559
可能是false
,在这种情况下,指数有可能(但不太可能)以完全不同的方式表示(例如,作为 2 的补码而不是有偏整数)。
不过,指数的不同表示确实不太可能。即使是 VAX 和 IBM 大型机格式,虽然在其他方面与 IEEE 明显不同,但它们的指数仍然使用超 N 格式。