为什么更高精度的浮点格式有这么多指数位?

Why do higher-precision floating point formats have so many exponent bits?

我一直在研究浮点格式,IEEE 754 and x87。总结如下:

                Total       Bits per field
Precision       Bits    Sign  Exponent  Mantissa
Single          32      1     8         23  (+1 implicit)   
Double          64      1     11        52  (+1 implicit)
Extended (x87)  80      1     15        64
Quadruple       128     1     15        112 (+1 implicit) 

我的问题是,为什么更高精度的格式有这么多的指数位?单精度为您提供大约 10^38 的最大值,我可以看到在极端情况下(宇宙中的原子数)您可能需要更大的指数。但是双精度高达 ~10^308,而扩展精度和四精度具有更多的指数位。这似乎比实际硬件加速计算所需要的要大得多。 (负指数更荒谬!)

话虽这么说,尾数位显然很有价值,我认为必须有充分的理由牺牲它们以支持指数。那是什么?我认为这可能是表示两个相邻值之间的差异而不需要次正规,但即使这样也不会对指数造成很大的变化(-6 在 +1023 到 -1022 的整个范围内为双)。

IEEE-754 浮点标准源于加州大学伯克利分校的 William Kahan 教授在英特尔着手创建 8087 数学协处理器时作为英特尔顾问所做的工作。成为 IEEE-754 浮点格式的设计标准之一是尽可能与现有的专有浮点格式在功能上兼容。本书

John F. Palmer 和 Stephen P. Morse,“8087 入门”。威利,纽约,1984 年。

特别提到CDC 6600的60位浮点格式, 对于双精度格式,具有 11 位指数和 48 位尾数。

以下已发表的采访(莫名其妙地将 Jerome Coonen 的名字改成了 Gerome Kunan)提供了一个简短的 IEEE-754 起源的概述,包括对浮点格式选择的讨论:

Charles Severance,“IEEE 754:William Kahan 访谈”,IEEE 计算机,卷。 31,第 3 期,1998 年 3 月,第 114-115 页 (online)

在采访中,William Kahan 提到了采用极受欢迎的 DEC VAX 小型计算机的浮点格式,特别是 F format for single precision with 8 exponent bits, and the G format 具有 11 个指数位的双精度。

VAX F 格式可以追溯到 DEC 早期的 PDP-11 架构,选择 8 个指数位的基本原理在 PDP-11/40 Technical Memorandum #16 中陈述:希望能够表示所有重要的物理常数,包括普朗克常数 (6.626070040 x 10-34) 和阿伏加德罗常数 (6.022140857 x 1023).

VAX 最初使用D format 双精度,它使用与 F 格式相同的指数位数,即 8。这被发现 在中间计算中通过下溢引起问题,例如在 LAPACK 线性代数例程中,正如 James Demmel 在 NA Digest Sunday, February 16, 1992 Volume 92 : Issue 7 中的贡献中所指出的那样。 Kahan的采访中也提到了这个问题,其中提到后来推出的VAX G格式是受CDC 6600浮点格式的启发

David Stephenson,“二进制浮点运算的拟议标准”,IEEE 计算机,卷。 14,第 3 期,1981 年 3 月),第 51-62 页 (online)

对IEEE-754双精度指数位数的选择解释如下:

For the 64-bit format, the main consideration was range; as a minimum, the desire was that the product of any two 32-bit numbers should not overflow the 64-bit format. The final choice of exponent range provides that a product of eight 32-bit terms cannot overflow the 64-bit format — a possible boon to users of optimizing compilers which reorder the sequence of arithmetic operations from that specified by the careful programmer.

IEEE-754 的“扩展”浮点类型专门作为中间格式引入,可以简化相应“常规”浮点类型的准确标准数学函数的实现。

Jerome T. Coonen,“对二进制浮点运算标准的贡献”。博士论文,大学。加州大学伯克利分校 1984

指出前体是 IBM 709x 和 Univac 1108 机器中的扩展累加器,但我不熟悉它们所使用的格式。

根据 Coonen 的说法,选择扩展格式中的 尾数位 是由二进制-十进制转换以及一般求幂 x[=53= 的需要驱动的]y。 Palmer / Morse 也提到了求幂并提供了详细信息:由于求幂的误差放大特性,使用扩展格式的简单计算需要尾数中的附加位与常规格式的指数中的位一样多才能提供准确的结果.由于双精度使用 11 个指数位,因此双精度扩展格式需要 64 个尾数位。

除了 Coonen 的博士论文外,我还检查了在 IEEE-754 标准发布之前发布的文档草案,但无法找到双扩展格式中 15 位指数位数的规定理由。

根据个人 x87 浮点单元的设计经验,我知道基本数学函数的直接实现,没有中间溢出的危险,至少需要三个额外的指数位。具体使用 15 位可能是硬件设计的产物。 8086 CPU 使用 16 位字作为基本构建块,因此双扩展格式中 64 位尾数位的要求将导致包含 80 位(= 五个字)的格式,剩下 15 位用于指数。