是否有浮点指数偏差的规范?

时间:2018-05-01 14:39:35

标签: 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

2 个答案:

答案 0 :(得分:3)

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

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

注意

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

答案 1 :(得分:1)

我认为你必须在这里作出假设。

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

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