以下内容出自《研知识-计算机组成原理精深解读》59页2.4浮点数的表示和运算
计算机组成原理——第2章 数据的表示和运算
1、考点解读
本章内容多、基础知识点多、计算多,属于重点考查的章节,也是后续内容的基础。本章的知识或考点脉络清晰,包括定点数编码、补码加减、原码与补码乘除、浮点数格式、浮点数加法运算、加法器的电路等。
本章最近10年联考考点题型分值统计表
2、浮点数的加/减运算
下面是计算机浮点数的加/减运算的主要步骤,不再讨论可能产生的溢出及其他的问题。主要的步骤有:
(1)检查是否有操作数是0,只要有1个操作数为0,则可以马上得到加减的结果。
(2)检查两个操作数的阶码是否相等。如果不相等,进行阶码对齐操作。将阶码小的数转换为阶码大的数。
(3)把两个尾数进行加法或减法运算,并确定结果的符号。
(4)检查结果是否是规范的浮点数,如果不是规范的浮点数,则进行规范化处理,把结果转换为规范化的浮点数。
提示:实际在进行加法或减法运算前,两个数的有效数分别送入运算器的两个寄存器内,这两个寄存器的位数多于尾数的位数,多于的位数用0填充。这样做的目的是提高运算的精确度。
【例题】假定有一个12位的浮点数表示法。它的形式与IEEE754定义的单精度格式类似。其最高位是1个符号位,后面是5位阶码域,这样阶码域的偏移量是15(24-1),最后6位是尾数域。用该方法表示的该浮点数A=0 10100 011001,B=0 10001 100101。写出计算机执行浮点数加法的过程。
【解答】A=+1.01 1001 × 25 ,B=+1.100101 × 22
(1)由于A的阶码较大,需要调整B的阶码。把B的尾数向右移动3位,B的尾数变为0.001100101两个数的阶码都是 5。
(2)由于阶码是5,偏移量是 15,5+15=20,因此设置结果的阶码域为10100。
(3) 两个数都是正数,执行 A、B的尾数的加法运算,得到尾数的和是1.100101101,并设置结果的符号位为正。
(4) 结果1.100101101恰好是规范化的数,不需要进行规范化处理。但是由于只需要保存小数点后面6位,因此需要进行舍入处理。结果1.100101 101的最后3位为101(值为5),超过3位表示的值(8)的一半所以需要进行“入”操作,也就是:1.100101的最低位加上1,得到1.100110。
结果的浮点表示为:0 10100100110
说明:(1)因为在尾数加法后,结果的小数点前正好有1个1,说明是规范化的数。如果加法结果不是规范化的数,则需要进行规范化处理。
例如,假定尾数加法结果是0.0101 1101 1,小数点前面没有1,说明这不是规范化的数,需要对它进行规范化处理。小数点保持不动,把尾数结果向左移动2位,变为1.0111 011,同时把阶码减去2。
例如,假定加法结果是10.0101 1101 1,小数点前面有2位,说明不是规范化的数,需要进行规范化处理把该值向右移动1位,变为1.00101 1101 1,同时阶码加上1。
(2)在进行阶码对齐操作时,需要把尾数进行左移或者右移,需要保留完整的尾数,这样在进行尾数的加减运算时,可以提高结果的精确度。得到运算结果后,再把多余的尾数位数去掉。处理尾数多余的位有以下原则:
第一,直接去掉多余的位:
例如,运算结果是 1.10011010,现在只需要保留小数点后面4位,则直接去掉后面的 010,得到 1.1011。
第二,冯·诺依曼舍入:
如果保留位后面全为0,则直接去掉。如果多余位不全为0,则去掉多余位,同时把保留位中最低位设为1。
例如,运算结果是1.1011010,现在只需要保留小数点后面4位。多余位是010,则处理的结果是1.1011。
例如,运算结果是1.1010010,现在只需要保留小数点后面4位。多余位是010,则处理的结果是1.1011.
第三,IEEE 754 默认原则:
A.如果多余位的值超过多余位能表示的最大值的一半,也就是多余位形如IX…1…XX(以1开始后面不全为0),则把保留的最低位加1,去掉多余位。
换个描述就是:假定多余位(m位)的值超过2m值的一半,则需要进行“入”操作,给保留的最低位加1。
例如,结果为1.11011001,保留小数点后面4位,需要去掉的位是1001,它的值为9,4位二进制数可以表示 16 个不同的数,9 超过 8(16的 1/2),需要进行“入”操作。把 1.1101加上 1,得到 1.1110。
B.如果多余位的值不到多余位能表示的最大值的一半,也就是多余位形如0X…XX(以0开始)则直接去掉多余位。
换个描述就是:假定多余位(m位)的值不到2m值的一半,则需要进行舍弃操作,直接去掉多余位。
例如,结果为1.11010111,保留小数点后面4位。需要去掉的是0111,它的值为7,4位二进制数可以表示16个不同的数,7小于8(16的1/2),需要舍弃。最后得到的结果为 1.1101。
C. 如果多余位的值恰好为多余位能表示的最大值的一半,也就是多余位形如10…00(以1开始,后面均为0),则这时的处理原则是:需要保证保留的最低位为偶数(也就是0)。也就是说,如果保留的最低位为0,则直接去掉多余位,保留位不变。如果保留的最低位为1,则把保留的最低位加上1,直接去掉多余位。
例如,运算结果为1.11011000,多余位1000的值是8,正好是16的一半。则把 1000 直接去掉。同时由于小数点后为1101,值为13,不是偶数,则需要进行加1,变为14,则结果为 1.1110。
运算结果为 1.10101000,多余位1000的值是8,正好是16的一半。则把1000直接去掉。同时,由于小数点后为 1010,值为10,是偶数,则让1010保持不变。则结果为1.1010。
3、真题与习题精编
浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5位和7位(均含2位符号位)。若有两个数,则用浮点加法运算的最终结果是()【全国联考 2009年】
A.00111 1100010 B. 00111 0100010 C. 01000 0010001 D. 发生溢出
【精解】考点为浮点数加法运算。
29/32 化为二进制的方法:把29用二进制表示是11101,这是个整数,可以认为小数点在最右边。现在除以 32,就是小数点位置不动,把11101向右移动5位,则结果就是 0.11101。同理,得到5/8 的表示为:0.101。题目要求阶码和尾数均采用补码表示,且位数分别为5位和7位(均含2位符号位)。则,两个数表示形式为:
X:阶码 00111 尾数 00 11101;
Y:阶码 00 101 尾数 00 10100。
两个数都是正数,阶码也是正整数。
(1)对阶。我们很容易看出X的阶码大于Y的阶码,需要把Y的阶码变成和X阶码一样大。需要把Y的尾数变小,也就是Y的阶码增加 2,Y的尾数向右移动2位。(这里涉及补码的右移,为方便理解,本书在讲解补码时,使用整数来讲解。这里的尾数是纯小数,用补码表示。可以理解为在右移过程,也保持符号位不变。这里两个尾数都是正数,也使问题简化一点。)对阶后,表示为:阶码00111尾数0000101。
(2)尾数相加。由于都是正数,简单一点。
0011101+0000101=0100010,高2位是符号位,现在和的高2位不相等,则说明这两个补码相加结果发生溢出。
这里,出题人的目的是想考查浮点数的表示、补码的溢出、浮点数的加法过程。
可以看出,浮点数表示中使用补码,这很麻烦。IEEE754定义的浮点数的表示中没有使用补码,也是为了使问题简化。答案为 D。
4、命题研究
本章是本课程的基础与重点,涉及的知识点很多。
首先,考生应该熟练掌握十进制、二进制、十六进制的转换。这三者的转换是计算机的基础知识。补码知识是本章的重点。补码是现代计算机中有符号数的表示形式。历年的全国统考中,补码的表示补码的加减运算、乘法运算出现多次。补码的移位也出现过,补码加减运算后溢出进位 0F、进位 CF的设置也在全国统考中出现过。
海明码知识在全国统考中出现过。CRC校验在计算机网络的课程中也会讲到,在全国统考中没有出现过。奇偶校验是简单的校验方法,会结合串行传输知识进行考查,曾经在全国统考中出现过。
定点数的乘法、除法的算法是固定的,全国统考中没有考过,但从C语言程序的角度曾经考查过。考生可以从C语言的角度解题。
浮点数的概念、浮点数的表示、浮点数的范围在历年全国统考中多次出现,多以单项选择题为主,偶尔出现在综合题中。浮点数的加减运算在全国统考中出现过。这部分知识相对独立,难度中等,也需要考生熟练掌握。
串行加法器与并行加法器在全国统考中没有出现过,74181的应用是固定的知识,但涉及电路,对很多考生来说有难度,所以在全国统考中没有出现过。但需要学生掌握串行加法器的组成、并行加法器的组成,以及这两种加法器的特点。
总之,本章是出题的重点。涉及的知识点多,题型会结合C语言程序来考查,难度中等。需要考生熟练掌握。
5、模拟预测
1、某计算机采用类似IEEE754 单精度的格式表示浮点数。符号位占用1位,0代表正数,1代表负数。指数域占用8位。尾数域占用6位。A=100.5,B=-60.25,计算A+B。
2、按照IEEE754 的舍入原则,计算下列尾数,只保留小数点后6位的结果。
1.001011 011 1.000101 1100 1.110100 100
6、答案精解
1、【答案精解】
计算过程,为提高精度,尾数小数点后的尾数可以多于6位。
A=110 0100.1=1.1001 001x26
B=-11 1100.01=-1.11100 01 x25
(1)对B进行对阶处理。阶码增加1,变为6。尾数向右移动1位,变为 -0.11110001。
(2)两个尾数进行相减。1.1001 001-0.1111 0001=0.1010 0001
(3)0.10100001不是规格化的数,需要进行规格化处理。0.10100001向左移动1位,得到1.01000010。阶码减1,变为5。
(4)由于小数点后只保留6位,1.01000010的最低2位是10,10的值是2,正好是4的一半,而 1.010000的最低位是0,为偶数,则把10直接去掉,最终保留结果是1.010000。在尾数域只存储010000。运算结果为 1.010000x25,就是 40.0。
提示:从数学角度计算,A-B=100.5-60.25=40.25,而计算机的运算结果是40.0。可见,计算机进行浮点数运算的结果会出现与真实值的误差,这是正常的。
2、【答案精解】
IEEE 754的舍入原则:舍去的位的值不到位的最大值的一半,则舍去;超过一半则加上1;等于一半则使最低保留位为偶数。
1.001011011,需要去掉3位,3位的最大值为8(23),011为3,小于4,则舍去,得到 1.001011。
1.000101 1100,需要去掉4位,4位的最大值为16(24),1100大于8,则把1.000101的最低位加上1,得到 1.000110。
1.110100 100,需要去掉3位,3位的最大值为8(23),100等于4,由于1.110100的最低位为偶数,则100去掉,得到1.110100。