浮点加减运算对任意一个二进制数N,总可以表示成:N=2eXM,式中,E为数N的阶码,M称为数N的尾数,一般为绝对值小于1的规格化数(补码是允许为-1)两浮点数X,Y进行加减运算时,必须按以下几步执行:① 对阶,使两数的小数点位置对齐,小的阶码向大的阶码看齐② 尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)③ 规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化④ 舍入,为提高精度,要考虑尾数右移时丢失的数值位⑤ 判断结果,即判断结果是否溢出规格化又分左规和右规两种(1)左规当尾数出现0O.OXX・・・X或11.1XX・・・X时,需左规左规时尾数左移一位,阶码减1,直到符合补码规格化表示式为止(2)右规当尾数出现01.XX-X或10.XX-X时,表示尾数溢出,这在定点加减运算中是不允许的,但在浮点运算中这不算溢出,可通过右规处理右规时尾数右移一位,阶码加1.例,两浮点数x=2+010X0.110100,y=2+iooX(-0.101010),求x+y解:阶码取3位,尾数取6位(均不包括符号位),机器表示的形式分别为[x] 补=00100110100[y]=01001010110① 对阶补:先求阶差(两阶码的补码相减)00010+11100(减00100就是加一00100的补码,即11100)11110其真值为-2,即x的阶码比y的阶码小2[x]的阶码增大成0100,尾数右移两位卩[x]=01000001101② 尾数相加00.001101+11.01011011.100011相加结果为01001100011③ 规格化:最高有效位与符号位相同,需要左规,所以结果应为:[x+y]=00111000110补x+y=2+011X(-0.111010)4.舍入在对阶和右规的过程中,可能会将尾数的低位丢失,引起误差,影响了精度,为此可用舍入法来提高尾数的精度。
常用的舍入方法有三种1)截去法将多余的位截去,剩下的位不变其最大误差接近于数据最低位上的1特点:有舍无入,具有误差积累2)“0舍1入”法0舍1入”法类似于十进制运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1这样做可能使尾数又溢出,此时需再做一次右规其最大误差是最低位上的-1/2到接近于1/2之间,正误差可以和负误差抵消是比较理想的方法,但实现起来比较复杂3)“恒置1”法尾数右移时,不论丢掉的最高数值位是“1”或“0”,都使右移后的尾数末位恒置“1”这种方法同样有使尾数变大和变小的两种可能特点:尽管误差范围扩大了,但正负误差可以相互抵消,从统计角度,平均误差为0因此最后运算结果的准确性提高了综上所述,浮点加减运算经过对阶、尾数求和、规格化和舍入等步骤与定点加减运算相比,显然要复杂得多例,两浮点数x=2+iX0.1101,y=2+oiX0.1011,求x+y,舍入用0舍1入法解:阶码取3位,尾数取6位(均不包括符号位),机器表示的形式分别为[x] =01001101补[y]=00101011① 对阶:先求阶差(两阶码的补码相减)0010+1111(减0001就是加一0001的补码,即1111)0001其真值为1,即x的阶码比y的阶码大1[y]的阶码增大成10,尾数右移一位,即001011补由0舍1入知,此时[y]=01000110补② 尾数相加00.1101+00.011001.0011③ 规格化:因尾数符号位为01,需要右规(尾数右移1位,阶码加1),所以结果应为:[x+y]=011010011补由0舍1入知:x+y=2+11X0.1010{截去法① 由截去法知,此时[y]=01000101补② 尾数相加00.1101+00.010101.0010③ 规格化:因尾数符号位为01,需要右规(尾数右移1位,阶码加1),所以结果应为:[x+y]=011010010补由截去法知:x+y=2+iiX0.1001}由此可知,采用不同的舍入方法得到的结果可能不同,最后所导致的误差也不同。