5

IEEE 浮点指数存储为无符号整数,使用预定义的指数偏差来抵消指数。

指数偏差似乎始终等于浮点类型的位置numeric_limits<T>::max_exponent - 1T

但是,我没有任何文档说明这始终是正确的,而且我当然对非 IEEE 浮点格式一无所知。

这对于以下功能必须是已知的:

是否有它的规范,还是我必须假设numeric_limits<T>::max_exponent - 1

4

2 回答 2

3

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

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

笔记

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

于 2018-05-01T15:16:49.480 回答
1

我想你必须在这里做一个假设。

特别是,is_iec559可能是false,在这种情况下,指数有可能(但不太可能)以完全不同的方式表示(例如,作为 2 的补码而不是有偏整数)。

不过,指数的不同表示确实不太可能。即使是 VAX 和 IBM 大型机格式,虽然在其他方面与 IEEE 明显不同,但它们的指数仍然使用超 N 格式。

于 2018-05-01T14:55:32.073 回答