Appearance
浮点数运算
大纲定位
二(四)2 浮点数的加/减运算
要求:掌握对阶、尾数求和/差、规格化、舍入四步,并能判断各步是否引起溢出。大纲这一条只到"加/减"为止,不含乘除。
考情分析
408 的题型只有单项选择题和综合应用题两类。浮点加减目前以 2 分选择题出现,考法集中在两类:① 叙述判断——四步中每一步对阶码/尾数的影响,哪一步可能引起上溢或下溢;② 给定阶码尾数完整走一遍并判断最终是否溢出(这一步最容易在流程跑完后忘记核)。
浮点加减运算步骤
浮点加减法分为四步,顺序不能颠倒:
第一步:对阶
两个浮点数
原则:小阶向大阶看齐。
若
为什么不是大阶向小阶?尾数左移会丢失高位有效数字,而右移只丢失低位,精度损失更小且可通过舍入弥补。
WARNING
右移时符号位保持不变(算术右移),移出的低位需要保留,用于后续舍入。
第二步:尾数加减
对阶后两数阶码相同,直接对尾数执行补码加法或减法:
与定点补码加减法完全相同,符号位参与运算。
第三步:规格化
运算结果可能不满足规格化条件,需要调整。
左规:结果绝对值太小(如
右规:尾数加法产生溢出(双符号位不同,如 01.xxx 或 10.xxx),尾数右移 1 位,阶码加 1。右规最多做一次。
补码下的规格化判定:
即符号位与最高数值位不同。若相同(
第四步:舍入与溢出判断
对阶右移和右规都会移出低位数据,需要舍入处理。
| 舍入方式 | 规则 | 特点 |
|---|---|---|
| 0 舍 1 入 | 移出部分最高位为 1 则末位加 1 | 类似四舍五入,默认方式 |
| 恒置 1 | 不论移出位是什么,末位强制置 1 | 不产生进位 |
| 截断(朝零舍入) | 直接丢弃移出位 | 最简单,误差最大 |
| 就近舍入(IEEE 默认) | 四舍五入,中间值向偶数舍(banker's rounding) | 精度最高 |
保护位、舍入位与粘位(GRS)
为了减少右移时的精度损失,硬件在尾数右侧额外维护三位:
| 位 | 名称 | 作用 |
|---|---|---|
| G(Guard) | 保护位 | 右移时移出的第 1 位 |
| R(Round) | 舍入位 | 右移时移出的第 2 位 |
| S(Sticky) | 粘位 | 右移时所有更低位的或(只要有任何一位为 1,S 就为 1) |
GRS 位参与就近舍入的判断:
- GRS =
0xx:直接截断(不进位) - GRS =
1xx且不是恰好中间值:进位(末位 +1) - GRS =
100(恰好中间值):向偶数舍入(末位为 1 则进位,为 0 则截断)
0 舍 1 入的进位可能使尾数再次溢出,此时需要额外做一次右规。
溢出判断发生在阶码上:
- 上溢:规格化后阶码超过最大值(如单精度
),结果为 - 下溢:阶码低于最小值,结果按非规格化数处理或置零
尾数溢出不等于结果溢出——尾数溢出可以通过右规修正。
哪一步会引起哪种溢出
叙述判断题几乎全部落在这张表上。判断依据只有一条:这一步把阶码往哪个方向动了。
| 步骤 | 阶码怎么动 | 可能上溢 | 可能下溢 |
|---|---|---|---|
| 对阶 | 小阶升到大阶,结果阶码 = 两者中的大阶 | ✗ | ✗ |
| 尾数加减 | 不动阶码 | ✗ | ✗ |
| 左规 | 每次减 1(可能多次) | ✗ | ✓ |
| 右规 | 加 1(最多一次) | ✓ | ✗ |
| 舍入 | 末位进位可能导致尾数再次溢出 | ✓ | ✗ |
对阶为什么绝不会溢出
这一条常被怀疑,因为对阶时尾数在动。但看阶码:对阶只是把小的那个阶码抬到大的那个阶码,结果阶码等于原来两个阶码中较大的一个。
两个操作数本来就是合法浮点数,它们的阶码都在表示范围内,取其中较大的那个当然也在范围内。对阶不产生任何新的阶码值,所以既不会上溢也不会下溢。
真正被牺牲的是尾数精度(右移移出低位),不是阶码。
舍入也能引起上溢,别只盯着右规
这是四条判断里最容易漏的一条。舍入本身只碰尾数,但进位可能把尾数顶溢出:
阶码就这样被舍入间接推高了一格。如果原本阶码已是最大值,这一格就溢出了。
所以"右规和尾数舍入都可能引起阶码上溢"是正确说法。
尾数溢出 ≠ 结果溢出:尾数加减产生的溢出(双符号位 01.xxx 或 10.xxx)是可以靠右规救回来的——右移一位、阶码加 1 就恢复了。只有阶码超出范围才是真溢出。反过来,尾数溢出后右规导致阶码上溢,那才是结果溢出。
交互可视化
例题
例 1:设浮点数格式为阶码 4 位(补码)、尾数 6 位(补码,双符号位),计算
对阶:
阶码统一为
尾数相加:
双符号位 01 00,尾数溢出。
右规:右移 1 位,阶码加 1。
舍入:右规移出位为 0,无需进位。
溢出判断:阶码
结果:
验证:11(即 0.75)被移出舍弃所致,结果合理。
例 2:IEEE 754 单精度,
对阶:
尾数相加:
已规格化,无需调整。结果 =
浮点乘除法(超纲·选读)
不在现行大纲内
大纲「二(四)浮点数的表示和运算」只有「1. 浮点数的表示(IEEE 754 标准)」和「2. 浮点数的加/减运算」两条,不含乘除;主教材对应小节也标为选讲。
本节保留的理由是它能把「阶码是移码」这件事讲透——两个移码相加会多算一个偏置量,必须减掉。理解了这一点,回头看加减法里的对阶和 IEEE 754 的阶码设计会更顺。但它不是考点,复习时间紧就跳过。
浮点乘除法不需要对阶,直接操作阶码和尾数:
乘除后同样需要规格化和舍入。
数值例 1(补码/无偏置阶码体系):
- 阶码相加:
- 尾数相乘:
- 规格化:尾数首位无效,左规 1 位 →
,阶码减 1 → - 取 4 位尾数:
(低位为 0,无舍入损失)
结果
数值例 2(IEEE 754 移码阶码体系):
, ; , - 阶码:
(真值 1)——这里必须减 bias,否则偏置被算了两次 - 尾数:
(即 ),已规格化
结果
两个例子答案相同,但阶码处理完全不同——这就是上面"先看清阶码体系"的意义。
公式的适用体系
上面两个公式针对 IEEE 754 这类移码(带偏置)阶码:移码相加会多出一个 bias 所以要减掉,相减会消掉 bias 所以要加回。若题目阶码用补码表示(本文前面的对阶例题就是补码阶码体系),直接
考点清单
- [ ] 浮点加减四步:对阶 → 尾数运算 → 规格化 → 舍入
- [ ] 对阶规则:小阶向大阶对齐(尾数右移)
- [ ] 规格化条件:补码下符号位与最高数值位不同
- [ ] 左规可能多次,右规最多一次
- [ ] 0 舍 1 入的舍入规则,舍入后可能需再次右规
- [ ] GRS(保护位/舍入位/粘位)用于提高舍入精度,就近舍入是 IEEE 754 的默认模式
- [ ] 溢出判断在阶码上:阶码超范围才是真溢出
- [ ] 对阶不会引起任何溢出——结果阶码 = 两个阶码中的较大者,不产生新值
- [ ] 左规可能下溢(阶码减);右规可能上溢(阶码加)
- [ ] 舍入也可能引起上溢——进位顶溢尾数后要再右规,阶码跟着加 1
- [ ] 尾数溢出不一定是结果溢出,右规可以救回来