Floating point 为什么IEEE754为双二进制64选择11个指数位?

Floating point 为什么IEEE754为双二进制64选择11个指数位?,floating-point,double,precision,ieee-754,Floating Point,Double,Precision,Ieee 754,我一直在阅读,IEEE 754似乎将64位浮点(双)指数定义为11位。() 我的问题是为什么? 64位浮点有53位有效位(第一位暗示为1,因此实际上只存储52位)-因此需要指数至少能够表示数字53(能够将二进制基数点移动到有效位中的任何位置),因此现在需要7位 然后你还需要负指数,所以8位 此外,还需要表示0、负无穷大和正无穷大,以及NaN-(这些需要4个额外的表示),所以我猜是10位 所以我的问题是:为什么指数是11位,而不是10或12位,对于其他长度的浮点数,如何确定它们?相关:关于为什么这

我一直在阅读,IEEE 754似乎将64位浮点(双)指数定义为11位。()

我的问题是为什么?

64位浮点有53位有效位(第一位暗示为1,因此实际上只存储52位)-因此需要指数至少能够表示数字53(能够将二进制基数点移动到有效位中的任何位置),因此现在需要7位

然后你还需要负指数,所以8位

此外,还需要表示0、负无穷大和正无穷大,以及NaN-(这些需要4个额外的表示),所以我猜是10位

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

相关:关于为什么这样做设计选择

维基百科的网站非常棒

另请参见Bruce Dawson的FP系列文章,这是中级/高级理解FP的必要阅读

也非常适合尝试位模式


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

设计选择是一个给予大量动态范围的问题,以在大量数字范围内保持高精度

因此,您需要指数能够表示至少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仍然是一个很大的范围

最大(所有)指数值表示Inf(有效位=0)或NaN(任何其他有效位值)因此IEEE binary64在NaN有效负载上花费了2倍的2^52位模式——2/2的2^64编码空间。这并没有像设计者所希望的那样得到多大的使用,而且可能更好地花在逐渐溢出上,比如低于正常值如何允许逐渐下溢

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


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

这是一个二进制点,而不是小数点。我不理解你的推理。如果你想要一个真正高精度的窄范围类型,你可以有一个更小的指数字段,并使用位来表示更多的有效位。为了获得更宽的范围,以精度为代价,使用更多的指数位和更少的有效位。我觉得你没有完全理解隐藏位。它在存储的规范化值表示中被忽略,因为它总是1。但是如果您将这样的浮点分解为单个组件(或者如果硬件在内部这样做),它被添加到有效位。这不会影响指数。我确实理解隐藏位:它显然是1,所以为什么要存储它。但我的问题是指数,而不是有效位。请参阅edit@Isauceda:我想不是完全随意的(他们选择的时候我不在场)但是52+11+1=64,所以他们在有效位的位和指数(和符号)的剩余位之间选择了某种很好的平衡。他们也可以使用48+15+1,但这将最小化精度(但大大提高范围)。可以说53或多或少是“任意”的我回答了一个非常相似的问题