浮点数的加减法运算
前言:
运算过程:对阶、尾数求和、规格化、舍入、溢出判断
浮点加减运算
在计算机中,加减法运算用补码实现。
算术运算的常识:两个浮点数如果要进行加减法运算,它们的阶或者指数必须相等。
一、对阶
- 求阶差
- 如果把阶码大的向阶码小的看齐,就要把阶码大的数的尾数部分左移,阶码减小。这个操作有可能在移位过程中把尾数的高位部分移掉,这样就引发了数据的错误,所以,尾数左移在计算机运算中不可取。
- 如果把阶码小的向阶码大的看齐,在移位过程中如果发生数据丢失,也是最右边的数据位发生丢失,最右边的数据位丢失,只会影响数据的精度,不会影响数据的大小。
在计算机中,采用小阶向大阶看齐的方法,实现对阶。
二、 尾数求和
补码加法
三、规格化
提高浮点数的表示精度,把计算机的提供的能够表示数据的硬件资源尽可能有效的利用起来。
- 左规
尾数左移一位,阶码减1,直到数符和第一数位不同为止(机器数表示方式是补码)。 - 右规(尾数的绝对值太大时,右规)
尾数右移一位,阶码加1。
当尾数溢出( >1 )时,需要右规。
是否溢出,可以通过两位的符号位得出:
即尾数出现01.xx…xx或10.xx…xx(两位符号位不同)
四、舍入
舍入,是指数据的长度超过了计算机当中存储数据的物理器件所保存的数据长度。低位部分就要进行处理,保证数据能够以比较精确的精度保存在计算机当中。
在对阶和右规过程中,可能出现尾数末位丢失,引起误差。为了尽可能减小误差,就需要考虑舍入。
舍入的方法:
- 截断法
将移出的数据一律舍去。该方法简单,很常用。但是影响精度。 - 0舍1入法
移掉的是1,则尾数末尾加1,移掉的是0,就不加。
例题:如果采用0舍1入法进行舍入处理,则0.01010110011舍去最后一位后,结果为()。
A.0.0101011001
B.0.0101011010
C.0.0101011011
D.0.0101011100
分析:0舍1入就相当于十进制舍入方法中的4舍5入,当这个数舍去最后一位时,这个数如果是0就写0,
如果是1,那么尾数末尾加一。即B.0.0101011010
- (末位)恒置“1”法
将要保留的末位数据恒置1,无论右移掉的是1还是0,末位是1还是0。
五、溢出判断
例题1:x=0.1101✖201 ; y=(-0.1010)✖211。求x+y
解:先写出x和y的补码表示形式
[x]补码=00,01;00.1101
[y]补码=00,11;11.0110
- 对阶
①求阶差:- 11,10转化成十进制数→(-2)
所以根据小阶向大阶看齐,x的阶码向y的阶码看齐,并且x的阶码要加2,尾数要右移2位。
②对阶
对阶后的[x]补’=00,11;00.0011- 尾数求和
- 规格化
[x+y]补的尾数是11.1001,符号位是1,尾数的最高位也是1,补码形式表示。
采用左规的方式,使数据规格化:把尾数左移一位,同时阶码减一。
左规之后的数据:00,10;11.0010
得到结果为:x+y=(-0.1110)✖210例题2: x=0.1101✖210,y=0.1011✖201,求x+y(除阶符、数符外,阶码取3位,尾数取6位) 解: [x]补=00,010;00.110100 [y]补=00,001;00.101100 ①对阶小阶向大阶看齐,y向x看齐,[y]补’=00,010;00.010110
②尾数求和
00.110100+00.010110=
01.001010③右规
尾数溢出需要右规,位数右规一位,尾数等于00.100101,同时阶码要加一
[x+y]补=00,011;00.100101
x+y=0.100101✖211