浮点运算与 IEEE 754:硬件怎么表示和计算实数
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**数字逻辑第四十篇。前面的算术都是整数,这一篇补上处理器里最复杂的算术部件——浮点(FPU):理解了三段表示和「对阶—运算—规格化」三步,就抓住了 IEEE 754 的主干。
本文要回答的问题
- 一个 32/64 位浮点数的符号、指数、尾数位是怎么切分的?为什么指数要用偏移码?
- 「隐含的前导 1」省了什么?非规格化数(denormal)解决了什么问题?
- 浮点加法为什么不能直接加尾数?对阶是怎么用 LZC 和移位完成的?
- 运算后为什么要重新规格化、还要舍入?「就近偶舍入」怎么实现?
- 浮点为什么不满足结合律?五类异常标志分别什么含义?
一、三段表示:sign | exponent | fraction
以单精度(binary32,32 位)为例:1 位符号 S + 8 位指数 E + 23 位小数 F;双精度(binary64)是 1+11+52。
31 | 30 ... 23 | 22 ..................... 0
S | E | F表示的数值(规格化)为:(-1)^S × 1.F × 2^(E - bias),其中单精度 bias=127、双精度 bias=1023。两个设计巧思:
- 偏移码存指数:指数字段 E 是「真实指数 + bias」的无符号数,于是两个浮点数当整数比较也能大致排序(正数部分),且指数有正有负时无需符号位;
- 隐含前导 1:规格化二进制数最高位恒为 1(类似科学计数法的个位非零),这个 1 不存,尾数 23 位实际有 24 位精度,白赚一位。
二、五种取值:不只是普通数
指数字段的全 0 和全 1 被保留,构成完整取值空间:
| E | F | 含义 |
|---|---|---|
| 1..254 | 任意 | 规格化数 1.F × 2^(E−127) |
| 0 | 0 | 带符号零 ±0 |
| 0 | 非 0 | 非规格化数 0.F × 2^(−126),填补 0 到最小规格化数之间的鸿沟,实现渐进下溢 |
| 255 | 0 | ±∞(除以 0 的结果) |
| 255 | 非 0 | NaN(0/0、∞−∞ 等无效运算) |
非规格化让「最小数再小一点」不直接跳到 0,但代价极高:它打破了「隐含 1」,FPU 要么特殊处理(显著拉慢、可能用微码/异常模拟),高性能设计里常见 FTZ/DAZ 模式直接把它当 0。
三、浮点加减三步:对阶 → 加尾数 → 规格化+舍入
尾数有效位是对齐到不同指数的,不能直接相加。完整流程:
- 对阶(align):比较两指数,让小指数向大指数看齐——把小指数数的尾数右移
Δexp位并同步抬高其指数。右移会从低位丢精度。 - 尾数相加/减:把两尾数(都补成带隐含 1 的定点数、处理符号)送定点加法器;减法可能得到很多前导零。
- 重新规格化 + 舍入:加法若进位则右移一位、指数+1;减法若最高有效位塌下去则用 LZC/前导零计数找出移位量、左移并减指数。再按舍入模式把超出 24/53 位的部分处理掉。
对阶移位量和再规格化移位量都由指数差/LZC 决定,因此 FPU 里除了加法器还有大桶形移位器和前导零检测——LZC 常是关键路径,有的设计用前导一预测(LZA)与加法并行做以省一拍。
四、乘除与舍入模式
- 乘法:符号异或、指数相加(减 bias)、两个 24/53 位尾数走整数乘法器得双宽积,再规格化一位并舍入;
- 除法:指数相减、尾数相除,用除法器或牛顿迭代求倒数,通常多周期;
- 就近偶舍入(round to nearest, ties to even):默认模式,超出的部分超过半 ULP 就入、不足就舍,正好半 ULP 时舍到「末位为偶」,避免统计偏差。其它模式有向零截断、向 ±∞ 舍(区间算术需要)。
五、为什么浮点「不准」、异常标志与 FPU 代价
- 不满足结合律:
(a+b)+c ≠ a+(b+c),因为每次运算都可能对阶丢低位;数量级相差悬殊时小的会被「吃掉」。比较浮点相等也不可靠,通常改判差值小于 epsilon。 - 五类异常标志:无效运算(NV,给 NaN)、除零(DZ,给 ∞)、溢出(OF)、下溢(UF,结果进非规格化区)、不精确(IX,发生了舍入)。和整数 ALU 的 N/Z/C/V类似是「粘滞状态」,但语义是 IEEE 754 规定的默认结果而非一定 trap。
- 硬件代价:FPU 要加法器 + 大移位器 + LZC/LZA + 舍入逻辑 + 指数通路 + 特殊值处理,延迟常是整数运算的数倍,因此普遍做成多周期/流水线(甚至独立执行单元、乱序 FPU),面积和功耗都显著。成本/功耗敏感的嵌入式核常用软浮点(库模拟)或干脆只上定点/DSP。
与现有篇目的衔接
- 前置:加法器、乘法器、ALU 标志、优先级编码器/LZC
- 配套:除法器、加法器进阶
- 应用:RISC-V F/D 扩展、FPGA定点数/DSP48
总结
一句话总结:IEEE 754 用「符号 + 偏移码指数 + 尾数」表示实数,单精度 1+8+23、双精度 1+11+52,偏移码让指数无符号可比排序,规格化尾数隐含一个前导 1 白赚一位精度;指数字段全 0/全 1 划分出零、非规格化(渐进下溢但拖慢硬件)、无穷和 NaN;浮点加减必须三步走——小指数向大指数对阶(尾数右移丢低位)、尾数定点相加、再用 LZC 和桶形移位重新规格化并按就近偶舍入处理超宽部分,乘法是指数加、尾数乘、规格化一位,除法走除法器/倒数迭代;由于每次都可能对阶丢位,浮点不满足结合律、相等比较要用 epsilon,并产生无效/除零/溢出/下溢/不精确五类标志;FPU 因集成加法器、大移位器、LZC/LZA、舍入与特殊值逻辑而延迟面积都大,通常多周期流水线,成本敏感场景退回定点或软浮点。