为什么IEEE754选择11个指数位用于双精度二进制64?

问题描述 投票:1回答:1

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

我的问题是为什么?

64位浮点数具有53位有效位数(第一位暗示为1,因此实际只存储52位) - 因此您需要指数至少能够表示数字53(以便能够移动二进制数) radix指向有效数字中的任何位置),所以现在你需要7位。

那么你还需要负指数,所以8位。

你还需要0,负和正无穷大和NaN-(那些需要4个额外的表示)的表示,所以我猜10位。

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

floating-point double precision ieee-754
1个回答
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/布鲁斯道森的系列FP文章是对FP的中级/高级理解的必读书。

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


关于为什么指数字段必须是最小长度的大多数推理是错误的!您引用的一些因素是针对通用用例的合理设计选择,但不是必需的。

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

所以你需要指数能够至少表示数字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花费2x2 ^ 52位模式 - 其在NaN有效载荷上的2 ^ 64编码空间中的2个。这并没有得到设计师所希望的那样多的用途,并且可能更好地用于逐渐溢出,就像次正常允许逐渐下溢一样。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.