浮点运算

浮点加减法

  1. 对阶: 小阶看齐大阶
  2. 做加减法
  3. 尾数规格化 (1.M)
    1. 01.xxxx / 10.xxxx :右规 (尾数溢出)
    2. 00.0xxx / 11.1xxx :左规
    3. 00.1xxx / 11.0xxx :已规格化
  4. 舍入
    1. 零舍一入
    2. 置一

浮点乘除法

已知:

  • $x=S_{x} \cdot r^{j_{x}}$
  • $y=S_{y}\cdot r^{j_{x}}$

  • $x\cdot y=(S_{x}\cdot S_{y})\cdot r^{j_{x}+j_{y}}$
  • $\frac{x}{y}=\frac{S_{x}}{S_{y}}\cdot r^{j_{x}-j_{y}}$

故步骤为

  1. 尾数乘除

  2. 阶数加减

    • 阶码相加 $$(E_{1}+E_{2}){移}=E{1移}+E_{2移}-127$$

      实际实现用 $-127=+10000001B \ \mathrm{mod},2^{8}$

    • 阶码相减 $$(E_{1}-E_{2}){移}=E{1移}+[-E_{2移}]_{补}+127$$

取反补码加法

无论原码/补码/移码,都遵循 减法 $\equiv$ 取反补码加法

$$A-B=A+[-B]_{补}$$

  1. 规格化 (采用补码存储就对补码规格化)
  2. 舍入

溢出

  • 阶码溢出 $\Rightarrow$ 数量级
    • 阶码上溢 $\Rightarrow$ 认作 $\to \infty$
    • 阶码下溢 $\Rightarrow$ 认作 $\to 0$
  • 尾数溢出 $\Rightarrow$ 细节
    • 尾数上溢 $\Rightarrow$ 右规
    • 尾数下溢 $\Rightarrow$ 舍入

舍入

  • 就近舍入 (0 舍 1 入)
  • 朝 $+\infty$ 舍入
  • 朝 $-\infty$ 舍入
  • 朝 $0$ 舍入

MIPS

MIPS 中的浮点运算指令

  • 单精度 .s

    • add.s
    • sub.s
    • mul.s
    • div.s
  • 双精度 .d

    • add.d
    • sub.d
    • mul.d
    • div.d