《计算机组成与体系结构(原书第4版)》 —2.5.4 IEEE-754浮点标准
2.5.4 IEEE-754浮点标准
我们在本节中使用的浮点模型是为了简化和理解概念而设计的。可以扩展这个模型为任何我们想要的位数。直到20世纪80年代,这种扩展都是纯粹的任意的,导致在各个制造商的系统中有许多不兼容的表示。在1985年,IEEE公布了单精度和双精度浮点数标准。该标准官方称为IEEE-754(1985)。IEEE-754标准不仅定义了二进制浮点表示,而且指定了基本操作、异常条件、转换和算术。另一个标准是IEEE 854—1987,它提供了类似的十进制算术规范。2008年,IEEE修订了754标准,并成为人们所熟知的IEEE 754—2008。它沿习了754的单精度和双精度,并增加了对十进制算术和格式的支持,取代了754和854。我们只讨论浮点数的单精度和双精度表示。
IEEE-754单精度标准在8位指数上使用偏移值为127的移码。有效数假定在小数点左边隐含一个1,总共是23位。隐含的1被称为隐藏位或隐藏1,并允许实际有效数为24(24=23+1)位。包括符号位在内,总数字长为32位, 图2-2 IEEE-754单精度浮点表示如图2-2所示。
我们前面提到IEEE-754规格化规则有一个例外。因为这个标准假定在小数点的左边有1个隐含的1,有效数中的首位确实可以为零。例如,数字5.5=101.12=.10112×23。IEEE-754假定在小数点左侧有1个隐含的1,因此表示5.5为1.0112×22。因为1是隐含的,有效数为011,不是以1开头的。
表2-4显示了几个单精度浮点数表示,包括一些特殊的数。应该注意,0不是直接用给定格式表示的,因为在有效数中要求一位隐藏位。因此,0是使用指数全为0以及有效数全为0表示的特殊值。IEEE-754允许-0和+0,尽管它们是相等的值。因此,当比较浮点数为0时,程序员应该谨慎。
表2-4 IEEE-754单精度浮点数的一些例子
当指数为255时,表示的值为无穷大(其有一个零有效数)或“非数”(其具有一个非零有效数)。“非数”或NaN用于表示不是实数的值(例如,负数的平方根)或者作为错误指示符(如“除零”错误)。
根据IEEE-754标准,大多数数值被规格化并使其有效数有一个隐式前导1(假定在小数点左边)。另一个重要的约定是当指数是零时,有效数不为零。这表示一个没有隐藏位的非规格化数字。
单精度浮点数可表示的最大值(暂时不考虑符号)是2127×1.111111111111111111111112(称为MAX值)。我们不能使用全1的指数,因为那是为NaN(不是数值的特殊值)保留的。我们可以表示的最小数字为2-127×.000000000000000000000012(称为MIN)。我们可以使用全0的指数(这意味着数字是非规范的),因为有效数是非零值(并且表示为2-23)。由于前面的特殊值和有限的位数,单精度浮点数不能表示4个数字范围:小于-MAX的负数(负溢出),大于-MIN的负数(负下溢),小于+MIN的正数(正下溢),和大于+MAX的正数(正溢出)。
双精度数字是使用由11位指数和52位有效数组成的64位有符号数。移码是1023。数值范围可以表示为图2-3所示的IEEE双精度模型。当指数为2047时隐含为NaN。零和无穷大的表示对应于单精度模型。
图2-3 IEEE-754双精度数的范围
由于在性能上会有一些代价,大多数浮点处理单元(FPU)只使用64位模型,因此只需要设计和实现一组专用电路。
几乎每个最近设计的计算机系统都采用了IEEE-754浮点模型。不幸的是,在这个标准颁布之前,很多大型计算机系统已经建立了自己的浮点系统。把久负盛誉的架构转变到较新的系统已经花费了几十年的时间,如IBM大型机现在支持自己的传统浮点系统和IEEE-754。然而,在1998年之前,IBM系统一直在使用源于1964年System/360使用的相同的浮点运算架构。预计这两个系统将继续得到支持,因为在这些系统上运行着大量旧的软件。
- 点赞
- 收藏
- 关注作者
评论(0)