为什么IEEE754为double aka binary64选择11个指数位?

时间:2019-03-23 16:43:53

标签: floating-point double precision ieee-754

我一直在阅读,似乎IEEE 754将64位浮点数(双精度)指数定义为11位。 (https://en.wikipedia.org/wiki/Double-precision_floating-point_format

我的问题是为什么?

64位浮点数的有效位数为53位(第一个位隐含为1,因此实际只存储52位)-因此,您需要指数才能至少表示数字53(以便能够将二进制小数点移到有效数的任意位置),因此现在您需要7位。

然后,您还需要负指数,即8位。

此外,您还需要表示0,负无穷大和正无穷大,以及NaN-(它们需要4个其他表示),所以我猜是10位。

所以我的问题是:为什么指数要用11位而不是10或12,又如何确定其他长度的浮点数呢?

1 个答案:

答案 0 :(得分:3)

相关:Why do higher-precision floating point formats have so many exponent bits?关于为何以这种方式做出设计选择。

维基百科的https://en.wikipedia.org/wiki/Double-precision_floating-point_format很棒。

另请参阅https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/,布鲁斯·道森(Bruce Dawson)的FP系列文章对中级/高级FP理解至关重要。

https://www.h-schmidt.net/FloatConverter/IEEE754.html也非常适合尝试位模式。


关于为什么指数字段必须具有最小长度的大多数推理是错误的!您列举的一些因素是通用设计的合理选择-cases,但不是 required

设计选择是要提供很大的动态范围,以在较大范围的数字上保持高精度。

  

因此,您需要指数至少能够表示53(以便将二进制基数点移动到有效位数中的任何位置),因此,现在需要7位。

不是。没有内在的理由说明为什么采用IEEE754样式的二进制浮点格式需要支持足够大的指数范围才能实现这一目标。如果数字不重要,则可以选择很少的指数位,以至于即使具有最大指数,最接近的可表示值也相距不到1.0。

另外,6位为您提供64个指数值,这足以将二进制点移到53位有效位数的末尾。

  

然后,您还需要负指数,即8位。

是的,将动态范围设为1是很合理的。但是对于某些用例,例如音频处理中,您可能只会使用幅度为[0..1)起的数字。或者也许最多4以便为较大的临时值留出一些空间。

在这种情况下,您希望选择指数偏差,以使大多数指数值代表负指数。

  

此外,您还需要表示0,负无穷大和正无穷大,以及NaN-(它们需要4个其他表示),所以我猜是10位。

不,它不需要额外的标志位,仅根据信号的有效位来用信号表示Inf / NaN的一种指数编码。因此,对于您假设的8个指数位,这只会减少您从256到255的实际数字可能的指数值。例如2 ^ -127到2 ^ + 127仍然很大。

最大(全1)指数值表示Inf(有效数= 0)或NaN(任何其他有效值),因此IEEE binary64将2x 2 ^ 52位模式-2 ^ 64编码空间中的2个用于NaN有效载荷。这并没有像设计者所希望的那样有用,并且可能最好将其花费在渐进式溢出上,例如子范式如何允许渐进式下溢。

+-0.0是次正规数的一种特殊情况,其最小指数值(编码为0)且有效数= 0。有偏指数= 0表示有效数的前导0,而不是通常的隐式1。其他有效值是实数,允许逐渐下溢。这种特殊情况使“正常”数字又取了另一个指数值。

所以0.0由全零位模式表示,这非常方便,因为内存通常是用整数零初始化的,因此可以使用memset(仅接受1的数组)将数组归零。字节模式,而不是您需要使用其他任何重复的double来初始化数组的4或8字节模式