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

时间:2016-11-23 23:40:51

标签: floating-point

我一直在研究浮点格式,IEEE 754x87。以下是摘要:

                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,而扩展精度和四倍精度具有更多的指数位。这似乎比实际硬件加速计算所需的大得多。 (对于负面的指数,这更加荒谬!)

话虽如此,尾数位显然是有价值的,我认为必须有充分的理由牺牲它们以支持指数。那是什么?我认为可能是在不需要次正规的情况下表示两个相邻值之间的差异,但即使这样也不会对指数产生很大的改变(对于双精度,整个范围为+1023到-1022的-6)。 / p>

1 个答案:

答案 0 :(得分:6)

当英特尔开始创建8087数学协处理器时,加州大学伯克利分校的教授William Kahan已经完成了IEEE-754浮点标准的工作。成为IEEE-754浮点格式的设计标准之一是尽可能与现有的专有浮点格式功能兼容。这本书

John F. Palmer和Stephen P. Morse," 8087 Primer"。 Wiley,纽约,1984。

具体提到了CDC 6600的60位浮点格式, 相对于双精度格式,使用11位指数和48位尾数。

以下公布的访谈(令人费解地将Jerome Coonen的名字变成了Gerome Kunan)提供了一个简短的介绍 概述IEEE-754的起源,包括浮点格式选择的讨论:

Charles Severance," IEEE 754:采访William Kahan", IEEE Computer ,Vol。 1998年3月31日第3号,第114-115页 (online)

在访谈中,William Kahan提到采用极受欢迎的DEC VAX小型机的浮点格式,特别是F format用于8位指数位的单精度,而G format用于双倍具有11个指数位的精度。

VAX F格式可以追溯到DEC早期的PDP-11架构,选择8个指数位的基本原理在PDP-11/40 Technical Memorandum #16中说明:希望能够代表所有重要的物理常数,包括Plank常数(6.626070040 x 10 -34 )和Avogradro常数(6.022140857 x 10 23 )。

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

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

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

  

对于64位格式,主要考虑因素是范围;至少,   希望任何两个32位数字的乘积不应该   溢出64位格式。指数范围的最终选择   规定8个32位项的乘积不能溢出   64位格式 - 对优化编译器的用户可能有利   从由指定的算术运算序列重新排序   细心的程序员。

"扩展"浮点类型的IEEE-754被特别引入作为中间格式,便于实现相应的常规"准确的标准数学函数。浮点类型。

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

指出前驱是IBM 709x和Univac 1108机器中的扩展累加器,但我不熟悉那些用于这些的格式。

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

除了Coonen的博士论文之外,我检查了IEEE-754标准发布之前发布的草案文件,并且无法找到双扩展格式中15个指数位数的明确理由。

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