《计算机组成与体系结构(原书第4版)》 —2.5 浮点数表示
2.5 浮点数表示
如果想要搭建一台真正的计算机,可以使用刚刚研究过的任何整数表示法。我们将选择其中一个并继续设计任务。下一步是决定系统的字大小。如果希望系统很便宜,那么应选择一个较小的字大小,比如说16位。若有符号位,该系统可以存储的最大整数是32767。所以现在我们应该做一些事情来适应潜在的客户,他们想保存某一年内观看职业体育赛事的观众统计人数。当然,这个数字大于32767。没问题!让我们把字大小变得更大些。32位应该够了。我们的字现在对于任何想要计数的任何事情都足够大了。但如果这个客户还需要知道每位观众每分钟实际观看比赛花费的钱数。此数字可能是一个十进制小数。现在我们真的被卡住了。
解决这个问题最简单和最便宜的方法是继续使用16位系统,并说:“嘿,我们正在建立一个廉价的系统。如果你想用它做些奇特的事情,那么你自己会变成一个好的程序员。”虽然在今天的技术中这听起来非常滑稽,但在每一代计算机的早期,这是一个实际情况。在许多第一代大型机或微型计算机中根本没有像浮点单元这样的东西。多年来,聪明的编程技术使这些整数系统能够像浮点系统一样运行。
如果你熟悉科学计数法,那么你可能已经在考虑如何处理浮点数的操作了,即如何在一个整数系统中模拟浮点数运算。在科学计数法中,数字可以表示为两部分:小数部分和指数部分,指数部分表示将小数部分扩大10的若干次幂以得到所需要的值。所以要以科学计数法表示32767,可以写为3.2767×104。科学计数法简化了非常大或非常小的数字使用铅笔和纸的计算过程。它也是当今数字计算机中浮点计算的基础。
2.5.1 一个简单的模型
在数字计算机中,浮点数由3部分组成:符号位、指数部分(表示2的幂指数)和小数部分(这引发了大量关于采用哪种术语合适的争论)。当指代小数部分时,术语尾数被广泛接受。然而,许多人对采用这个术语持反对意见,因为尾数也表示对数的小数部分,但它与浮点数的小数部分不同。IEEE引入术语有效数并结合隐含的二进制小数点和隐含的1(我们在本节结尾处讨论)来指代浮点数的小数部分。遗憾的是,“尾数”和“有效数”这两个术语在指代浮点数的小数部分时已经可以互换了,然而它们在技术上并不等同。在本文中,我们将小数部分称为有效数,而不管其是否包含IEEE提到的隐含的1。
用于表示指数和有效数的二进制位数取决于我们是希望优化范围(在指数中有更多位)还是优化精度(在有效数中有更多位)。(我们在2.5.7节会更详细地讨论范围和精度。)对于本节的剩余部分,我们将使用一个14位模型,它包括5位指数、8位有效数和1个符号位(见图2-1)。更一般的形式在2.5.2节中描 图2-1 浮点表示的简单模型述。
假设希望在模型中存储十进制数17。我们知道17=17.0×100=1.7×101=0.17×102。类似地,在二进制中,1710=100012×20=1000.12×21=100.012×22=10.0012×23=1.00012×24=0.100012×25。如果使用最后一个形式,则小数部分为10001000,指数为00101,如下所示:
使用这种形式,可以存储比14位(它一共使用14个二进制数字加上一个二进制小数点)定点表示更大的数。如果想在这个模型中表示65536=0.12×217,则它表示为:
这个模型的一个明显问题是没有提供负的指数。这样就没有办法存储0.25,因为0.25是0.012=12×2-2,指数-2不能被表示。我们可以通过向指数添加一个符号位解决这个问题,但事实证明使用移码指数更有效,因为当比较两个浮点数时,我们可以使用专门为无符号数设计的更简单的整数电路。
回想一下2.4.3节,偏移值的想法是将该范围中的每个整数转换为非负整数,然后存储为二进制数。首先将这个固定偏移值加到每个指数上,然后调整指数范围内的整数。这个偏移值是靠近可能值范围中间的一个值,是我们选择表示0的值。在这种情况下,我们将选择15,因为它在0和31中间(指数有5位,因此允许表示25或数值32)。指数字段中任何大于15的数字表示正值,小于15的值表示负值。这称为偏移值为15的移码表示方法,因为我们必须减去15以获得指数的真实值。注意,全0或全1的指数通常被保留以用于特殊数(如零或无穷大)。在我们的简单模型中,允许有全0和全1的指数。
回到要存储17的示例中,我们计算得到1710=0.100012×25。偏差指数现在为15+5=20:
如果我们想存储0.25=0.1×2-1,则有:
这个系统还有一个相当大的问题:每个数字都没有唯一的表示。以下所有的内容都是等效的:
因为这些同义形式不太适合数字计算机,所以浮点数必须被规范,也就是说,有效数的最左边的位必须总是1。这个过程称为规格化。这个约定的另外一个优点是,如果隐含了1,那么在有效数中,我们获得了额外的一位精度。规格化对于除0之外的不包含非零位的每个值都能正常工作。因此,表示浮点数的任何模型都必须将零视为特殊情况。我们将在下一节中看到IEEE-754浮点标准对规范化规则例外的说明。
例2.34使用偏移值为15的移码表示的简单模型把0.0312510表示为规格化浮点形式。
0.0312510=0.000012×20=0.0001×2-1=0.001×2-2=0.01×2-3=0.1×2-4
应用这个移码,指数域是15-4=11。
请注意,在简单模型中,没有使用隐含1的标准化方法来表示这个数,这在2.5.4节中介绍。
- 点赞
- 收藏
- 关注作者
评论(0)