浮点数的加减运算
前言
浮点数的加减运算大体可以分为五步。
我们用一个实例来逐步体会做法。
题目:
X=0.1101 × 2+10 ,Y= - 0.1111×211,采用浮点数规格化形式求X+Y=?其中阶码4位(含阶符1位),用补码表示,尾数6位(含尾符1位)。 在舍入时采用0舍1入法。
对X和Y进行表示:
阶码 | 尾符 | 尾数(补码形式) | |
---|---|---|---|
[X]浮 | 0010 | 0 | 11010 |
[Y]浮 | 0011 | 1 | 00010 |
1.对阶操作
两个浮点数在运算前,一定要保证阶相同,所以我们应先对阶。
一般采用小阶对大阶的做法。
小阶对大阶时,小阶的阶码增大,且相应尾数应右移。
例如对于例题, X的阶码小,故应该让X的阶码增大到与Y的阶码相同,且X的尾数右移相应位数。对阶完成后如下所示:
阶码 | 尾符 | 尾数(补码形式) | |
---|---|---|---|
[X]浮 | 0011 | 0 | 01101 |
[Y]浮 | 0011 | 1 | 00010 |
2.尾数相加减
在对阶完成后,我们需要根据题目要求进行加减。
需要注意的是为防止溢出我们通过双符号判别法来进行加减运算,即把符号位写成双符号。这样符号位亦参与运算,可根据最后符号位判断是否有溢出,是什么溢出。
例如对于例题
[X]尾+[Y]尾=00 01101+11 00010=11 01111(加粗的是双符号位)
因为最终双符号位是11,所以没有溢出。
所以[X]浮+[Y]浮 =0011 1 01111
红色的是阶码,黑色的是尾符,蓝色的是尾数。
3.规格化处理
若尾数是用补码表示,则应该左移,使得尾符和尾数数据位的最高位相反。
若尾数是用原码表示,则应该使得尾数 数值最高位为1。
对于本例题,尾数 01111 是用补码表示,且尾符是1 , 尾数最高位为0,则无需进行规格化处理。
4.舍入操作
无论是对阶或者其他尾数需要向右移位时,都会舍弃尾数的最低位,一般在舍入时我们把最后移掉的那一位保存起来。
舍入处理有两种方法
- 0舍1入法:如果当时最后舍去的是0,则无需处理。若当时最后舍去的是1,则应在最低位+1.
- 末位置1法:不管最后舍去的是0还是1,只要曾舍去,都应令最后一位的数值为1.
对于本例题,刚才对阶右移舍去的是0,我们采用0舍1入法,则应无需处理。
最终结果应为0011 1 01111
5.判断结果是否溢出
根据阶码是否溢出来判断运算结果是否正确,阶码若产生下溢,则置运算结果为0,若产生上溢,则置溢出标志。
对于本例题阶码没有溢出,则最终结果应为-0.10001 × 2+11