浮点数的加减运算

$X=X_S \times 2^{X_E},Y=Y_S \times 2^{Y_E}$

  • 步骤
    1. 检查是否为零
    2. 阶码对齐,尾数移位
    3. 对尾数加或减
    4. 标准化结果
    5. 溢出判断
  1. 对阶

    1. 求阶差
      $\Delta E=\begin{cases}
      =0,已经对齐\
      \ne0,\begin{cases}大的向小的对齐:减小较r大的阶码,同时扩大其尾数\小的向大的对齐:增大较小的阶码,同时减小其尾数 \end{cases} \
      \end{cases}$
      在计算机中,尾数左移可能会使最高位数据丢j失,故采用小阶向大阶对齐
      浮点数加减

      浮点数加减的过程

一些溢出情况

1. Exponent overflow

  • 一个正的指数超出了指数的最大值(即127)
  • 指定为$-\infty 或 +\infty$

2. Exponent underflow

  • 一个负的指数小于了指数的最小值(即-126)
  • 指定为0.

3. Significand overflow

  • 同号的两个数字相加时,在最重要的位上产生了进位.
  • 在realignment时修正

4. Significand underflow

  • 在对齐尾数的时候, 数据可能从尾数的最右端流失
  • 需要某种形式的四舍五入

原码加减法(用于尾数的加减)

  • 如果两个操作数符号相同,做加法,否则做减法.

    • 加法:
      • 若最高位产生了进位,溢出
      • 符号同加数
    • 减法:加第二个数的补数
      • 若最高位产生进位,结果正确(符号等同于被减数)
      • 若没有进位,应该取结果的补数,最终结果与被减数相反.
        注意:此处可以是认定为没有符号位的补码在做计算,所以最终结果需要进行修正.(因为正数补码是它自身,负数补码是其反码加一)
        浮点数运算源码加减法

    更通俗的说法:最终算A+B的时候(无论是一开始就是A+B还是减法转化而来).如A,B同号,尾数是正常相加;若A,B异号,尾数为$AS+[B_S]补$

浮点数加减法举例

  • 减法
    0.5-(-0.4375)=0.5+0.4375=0.9375
    0.5   00111111000000000000000000000000
    -0.4375 10111110111000000000000000000000
     0.4375 00111110111000000000000000000000
    01111110-01111101=01111110+10000011=00000001
    则前者阶码比后者大,后者向前者对齐(后者阶码加1,尾数右移一位,此处尾数包含隐藏位,即橙色位).减法经处理后,两个操作数同号,尾数做正常加法

    10000...00
    + 01110...00
    ——————————
     11110...00

    加法计算没有进位,则结果正确,为

10111110111000000000000000000000
  • 加法
    0.5+(-0.4375)=0.0625
    0.5   00111111000000000000000000000000
    -0.4375 10111110111000000000000000000000

    01111110-01111101=01111110+10000011=00000001
    则前者阶码比后者大,后者向前者对齐(后者阶码加1,尾数右移一位,此处尾数包含隐藏位,即橙色位).两个操作数异号,尾数加法做加后者补数.

    10000...00
    + 10010...00
    ——————————
    1 00010...00

    符号相异产生进位,结果正确,与第一个操作数符号相同.经规格化后:

    10111101100000000000000000000000

浮点数乘法

浮点数乘

  • 步骤
    • 如果任何一个操作数为0,返回0.
    • 指数相加时需要减去偏差值,因为阶码用移码表示.
    • 尾数相乘.
    • 结果规格化并舍入.(可能造成指数溢出).

浮点数除法

浮点数除法

  • 步骤
    • 除数为0,报错或设为无穷.
    • 被除数为0,设为0.
    • 被除数的阶码和除数的阶码做差,并加回偏差值.
    • 尾数相除.
    • 结果标准化并舍入.

注意:和无符号整数除法不同:浮点数除法给被除数后面填零存入余数和商寄存器,而整数是高位填零.

保护位

为了提高精度,在计算时每个数字都存在保护位,暂时储存着计算后(比如右移)后的超出低位的数据.