浮点数的指数偏差有规范吗?
Is there a specification for a floating point’s exponent bias?
指数偏差似乎始终等于 numeric_limits<T>::max_exponent - 1
,其中 T
是浮点类型。
但是,我没有任何文档表明这始终是正确的,而且我当然对非 IEEE 浮点格式一无所知。
这必须是众所周知的功能,例如:
c++ 是否有它的规范,或者我必须假定 numeric_limits<T>::max_exponent - 1
?
我想你必须在这里做一个假设。
特别是,is_iec559
可能是 false
,在这种情况下,指数可能(但不太可能)以完全不同的方式表示(例如,作为 2 的补码而不是有偏整数).
指数的不同表示法确实不太可能。即使是 VAX 和 IBM 大型机格式,尽管在其他方面与 IEEE 截然不同,但它们的指数仍然使用 excess-N 格式。
C++ 没有定义偏差,您不需要知道它就可以使用 frexp
、ilogb
或 logb
。这些函数都使用 return 数学指数,而不是有偏差的指数。 (然而,对于 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
,每个函数的结果仅取决于数字的 value。无论您使用 frexp
的 float
还是 double
变体,您都会得到相同的结果。只有数学值很重要。相反,当您查看浮点值的内部表示时,指数将根据数据的格式而有所不同; float
与 double
有不同的偏见。
指数偏差似乎始终等于 numeric_limits<T>::max_exponent - 1
,其中 T
是浮点类型。
但是,我没有任何文档表明这始终是正确的,而且我当然对非 IEEE 浮点格式一无所知。
这必须是众所周知的功能,例如:
c++ 是否有它的规范,或者我必须假定 numeric_limits<T>::max_exponent - 1
?
我想你必须在这里做一个假设。
特别是,is_iec559
可能是 false
,在这种情况下,指数可能(但不太可能)以完全不同的方式表示(例如,作为 2 的补码而不是有偏整数).
指数的不同表示法确实不太可能。即使是 VAX 和 IBM 大型机格式,尽管在其他方面与 IEEE 截然不同,但它们的指数仍然使用 excess-N 格式。
C++ 没有定义偏差,您不需要知道它就可以使用 frexp
、ilogb
或 logb
。这些函数都使用 return 数学指数,而不是有偏差的指数。 (然而,对于 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
,每个函数的结果仅取决于数字的 value。无论您使用 frexp
的 float
还是 double
变体,您都会得到相同的结果。只有数学值很重要。相反,当您查看浮点值的内部表示时,指数将根据数据的格式而有所不同; float
与 double
有不同的偏见。