浮点数

浮点数标准

IEEE标准754-1985定义了浮点数的存储格式、运算规则、舍入方式以及特殊值的处理(如无穷大、NaN等)。其核心思想是用科学计数法的形式来表示实数:

R=(1)s×M×2E=(1)s×(1+F)×2E\begin{aligned} R &= (-1)^s \times M \times 2^E \\ &= (-1)^s \times (1+F) \times 2^E \end{aligned}

其中:

  • s为符号位;
  • M为尾数,即有效数字部分,在1-2之间;
  • F为小数部分,在0-1之间;
  • E为指数,表示以 2 为底的幂次。

IEEE 754 定义了多种精度格式,最常用的是单精度浮点数与双精度浮点数:

  • 单精度浮点数 总共 32 位(4 字节)
    • 1 位符号位
    • 8 位指数(偏移量为 127)
    • 23 位尾数(实际精度为 24 位,因为有隐含的前导 1)
  • 双精度浮点数 总共 64 位(8 字节)
    • 1 位符号位
    • 11 位指数(偏移量为 1023)
    • 52 位尾数(实际 53 位精度)

相对精度

在浮点数表示中,相对精度是近似恒定的(在同一个指数区间内),这是浮点数优于定点数的关键之一。

FN=23×log10223×0.36DN=52×log10252×0.316\begin{aligned} F_N &= 23 \times \log_{10}2 \approx 23 \times 0.3 \approx 6 \\ D_N &= 52 \times \log_{10}2 \approx 52 \times 0.3 \approx 16 \end{aligned}

浮点加法

计算分四步走:

  1. 对齐数字:按较小的指数移动数字
  2. 整数及尾数相加
  3. 规格化结果并检查是否上溢或下溢
  4. 若有必要,进位并再次规格化

我们首先考虑4位的十进制:9.999 × 101 + 1.610 × 10–1 = ?

1
2
3
4
5
   9.999  × 10^1 + 1.610 × 10^–1
= 9.999 × 10^1 + 0.016 × 10^1 // 对齐
= 10.015 × 10^1 // 整数与尾数相加
= 1.0015 × 10^2 // 规格化结果
= 1.002 × 10^2 // 进位并再次规格化

随后考虑4位的二进制:1.0002 × 2–1 + –1.1102 × 2–2 (0.5 + –0.4375) = ?

1
2
3
4
5
  1.000(2) × 2^{–1} + –1.110(2) × 2^{–2} (0.5 + –0.4375)
= 1.000(2) × 2^{–1} + –0.111(2) × 2^{–1} // 对齐
= 0.001(2) × 2^{–1} // 整数与尾数相加
= 1.000(2) × 2^{-4} // 规格化,未溢出
= 1.000(2) × 2^{-4} = 0.0625 // 无需进位与规格化

硬件实现

显然,与整数加法器相比,浮点加法器的硬件结构要复杂得多。考虑到其复杂性,在一个时钟周期内完成会花费太长时间,因此通常设计橙需要几个周期才能完成计算。常用流水线来实现。

浮点加法器硬件结构图