【问题标题】:Why did IEEE754 choose 11 exponent bits for double aka binary64?为什么 IEEE754 为 double aka binary64 选择 11 个指数位?
【发布时间】:2026-02-05 09:10:01
【问题描述】:

我一直在阅读,似乎 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。但是如果您将这样的浮点数分解为其单个组件(或者如果硬件这样做,内部),它被添加到有效数字。这不会影响指数。
  • 我确实理解隐藏的位:它显然是 1,所以为什么要存储它。但我的问题是关于指数,而不是有效数字,请参阅编辑
  • @Isauceda:我猜不是完全武断的(他们选择它时我不在场)。但是 52 + 11 + 1 = 64,所以他们在有效位和指数(和符号)的剩余位之间选择了某种很好的平衡。他们也可以使用 48 + 15 + 1,但这会最小化精度(但会大大提高范围)。您可以说 53 或多或少是“任意”选择的。
  • @Isauceda 我回答了一个非常相似的问题here

标签: floating-point double precision ieee-754


【解决方案1】:

相关: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,但不是必需的

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

所以您需要指数至少能够表示数字 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 有效负载上花费 2x 2^52 位模式 - 其 2^64 编码空间中的 2 个.这并没有像设计人员希望的那样得到尽可能多的使用,并且可能更好地用于逐渐溢出,例如次正规如何允许逐渐下溢。

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

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

【讨论】:

    最近更新 更多