阶数不一样,要把阶数调整为相同(往大的调整)之后再相加。 结果的尾数为两个尾数之和,阶数为调整之后的阶数。

浮点数加减法运算总共就5步: 对阶、尾数运算、规格化、舍入、溢出判断。

1.对阶:使x和y的阶码相等,以使尾数可以相加减。

    原则:小阶向大阶看齐,阶小的那个数的尾数右移(算术右移),右移的位数等于两个阶(指数)的差的绝对值。

    大多数机器采用IEEE754标准来表示浮点数,阶数为移码表示因此,对阶时需要进行移码减法运算,并且尾数右移时按原码小数方式右移,符号位不参加移位,数值位要将隐含的一位1右移到小数部分,空出位补0。
    为了保证运算的精度,尾数右移时,低位移出的位不要丢掉,应保留并参加尾数部分的运算。

    注:[Ex]移 - [Ey]移 = [Ex - Ey]补

    tips:自己手算时直接用真值算即可

2.尾数加减:

    对阶后两个浮点数的指数相等,可以进行对阶后的尾数相加减。

    因为IEEE754采用定点原码小数表示尾数,所以,尾数加减实际上是定点原码小数的加减运算(与定点加减法一样)。

    因为IEEE754浮点数尾数中有一个隐藏位,所以,在进行尾数加减时,必须把隐藏位还原到尾数部分。
    运算过程中,在尾数右移时保留的附加位也要参加运算。
    因此,在用定点原码小数进行尾数加减运算时,在操作数的高位部分和低位部分都需要进行相应的调整。

    进行加减运算后的尾数不一定是规格化的,因此,浮点数的加、减运算需要进一步进行规格化处理。

3.尾数规格化:左规  右规 保证最高有效位为1

    右规:尾数右移一位,阶码加1。尾数右移时,最高位1被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。

    左规:数值位逐次左移,阶码逐次减1,直到将第一位1(隐藏位)移到小数点左边。

4.尾数的舍入处理:在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的位保留下来,参加中间过程的运算,最后再将运算结果进行舍入,还原表示成IEEE 754格式。
    
    (1)保留多少附加位才能保证运算的精度?
            IEEE754标准规定,所有浮点数运算的中间结果右边都必须至少额外保留两位附加位。
            这两位附加位中,紧跟在浮点数尾数右边那一位为保护位或警戒位(guard) ,用以保护尾数右移的位;紧跟保护位右边的是舍入位(round) ,左规时可以根据其值进行舍入。
            在IEEE 754标准中,为了更进一步提高计算精度,在保护位和舍入位后面还引入了额外的一个数位,称为粘位(sticky),只要舍入位的右边有任何非0数字,粘位就被置1;否则,粘位被置0。
    (2)IEEE754标准的舍入方法:
            a.0舍1入。
            b.朝+∞方向舍入。总是取右边最近可表示数,也称为正向舍入或朝上舍入。
            c.朝-∞方向舍入。总是取左边最近可表示数,也称为负向舍入或朝下舍入。
            d.朝0方向舍入。直接截取所需位数,丢弃后面所有位,也称为截取、截断或恒舍法。
            这种舍入处理最简单。对正数或负数来说,都是取更靠近原点的那个可表示数,是趋向原点的舍入,因此,又称为趋向零舍入。

5.溢出判断
    
    在进行尾数规格化和尾数舍入时,可能会对结果的阶码执行加、减运算。
    因此,必须考虑结果的指数溢出问题:

        (1)若一个正指数超过了最大允许值(127或1023),则发生指数上溢,机器产生异常,也有的机器把结果置为+∞(数符为0时)或-∞(数符为1时)后,继续执行下去。
        (2)若一个负指数超过了最小允许值(-149或-1074),则发生指数下溢,此时,一般把结果置为+0(数符为0时)或-0(数符为1时),也有的机器引起异常。

    溢出判断实际上是在上述尾数规格化和尾数舍入过程中进行的,只要涉及阶码求和/差,就可以在阶码运算部件中直接用溢出判断电路来实现。涉及阶码求和/差的情况有以下情况:

        (1)右规和尾数舍入。一个数值很大的尾数舍入时,可能因为末尾加1而发生尾数溢出,此时,可以通过右规来调整尾数和阶。
        右规时阶加1,导致阶增大,因此需要判断是否发生了指数上溢。只有当调整前的阶码为1111110,加1后,才会变成1111111而发生上溢;如果右规前阶码已经是1111111,则右规后变为0000000,因而会造成判断出错。
        所以,右规前应先判断阶码是否为全1,若是,则不需右规,直接置结果为指数上溢;否则,阶码加1,然后判断阶码是否为全1来确定是否指数上溢。

        (2)左规。左规时数值位逐次左移,阶码逐次减1,所以左规使阶码减小,故需判断是否发生指数下溢。
        其判断规则与指数上溢类似,首先判断阶码是否为全0,若是,则直接置结果为指数下溢;否则,阶码减1,然后判断阶码是否为全0来确定是否指数下溢。

    从浮点数加、减运算过程可以看出,浮点数的溢出并不以尾数溢出来判断,尾数溢出可以通过右规操作得到纠正。
    运算结果是否溢出主要看结果的指数是否发生了上溢,因此是由指数上溢来判断的。