Appearance
题目
下列有关浮点数加减运算的叙述中,正确的是( )。
Ⅰ. 对阶操作不会引起阶码上溢或下溢
Ⅱ. 右规和尾数舍入都可能引起阶码上溢
Ⅲ. 左规时可能引起阶码下溢
Ⅳ. 尾数溢出时结果不一定溢出
错因
A
漏选了 Ⅰ 和 Ⅳ。漏 Ⅰ:可能误以为对阶时小阶向大阶看齐会让小数的阶码"上溢到"大阶,实际上大阶本身就是合法的浮点数表示,不可能"溢出"——对阶只是改写小阶那个加数的阶码到一个已存在的合法值。漏 Ⅳ:把"尾数溢出"和"结果溢出"等同了,没意识到尾数溢出是可以靠右规化解的。
B
漏选了 Ⅲ。错答 Ⅲ "左规时可能引起阶码下溢"——可能记错成"只有右规会引起阶码越界"。实际上左规和右规对阶码的影响是对称的:右规阶码 +1(可能上溢),左规阶码 −1(可能下溢)。两个方向都可能越过表示范围。
C
漏选了 Ⅱ。错答 Ⅱ "右规和尾数舍入都可能引起阶码上溢"——多半只承认"右规会上溢",不接受"尾数舍入也能上溢"。实际场景:尾数舍入时最低位的进位可能传播到尾数最高位,比如尾数 1.111…1 + 舍入位 → 10.000…0,这时尾数本身又溢出了,必须再做一次右规——这次右规就可能把已经接近上界的阶码顶出去。
总解析
浮点加减运算的标准流程是 对阶 → 尾数加减 → 规格化 → 舍入 → 溢出判断。这道题的四个判断恰好覆盖了流程中每一步对阶码和尾数的影响。逐项验证:
Ⅰ. 对阶不会引起阶码上溢或下溢 ✓
对阶规则是"小阶向大阶看齐"——把阶码较小的那个加数的尾数右移、阶码加大到与另一个加数相等。
- 大阶本身就是输入数据的合法阶码,把它赋给另一个加数后,阶码仍在合法范围内
- 所以对阶过程中阶码永远不会越界
会越界的反而是尾数——尾数右移可能丢失精度甚至全为 0("大数吃小数")。但题目问的是阶码上下溢,所以 Ⅰ 正确。
Ⅱ. 右规和尾数舍入都可能引起阶码上溢 ✓
| 触发场景 | 阶码变化 | 风险 |
|---|---|---|
| 右规(尾数加减后绝对值 ≥ 1,需右移) | 阶码 +1 | 可能上溢 |
| 尾数舍入后进位到最高位 → 又触发一次右规 | 阶码再 +1 | 可能上溢 |
第二种就是关键:尾数 1.111…1 舍入加 1 → 10.000…0,此时尾数又溢出,要再次右规、阶码再 +1。如果此时阶码已经接近上界,这一步就把它顶出去了。所以"舍入间接引起上溢"是 Ⅱ 的实质。
Ⅲ. 左规时可能引起阶码下溢 ✓
左规:尾数加减后绝对值 < 0.5(即尾数最高有效位不在小数点后第 1 位),需要左移尾数、阶码 −1。
- 极端情况:相近大小的数相减导致有效位大量抵消(catastrophic cancellation),可能要连左规多次,阶码连续 −1
- 阶码减到下界以下 → 下溢
所以 Ⅲ 正确。
Ⅳ. 尾数溢出时结果不一定溢出 ✓
"尾数溢出" ≠ "浮点数溢出"。尾数溢出是指尾数加减后绝对值 ≥ 1(比如 0.1xxx + 0.1xxx = 1.0xxx),但这种情况可以通过右规化解:
| 尾数状态 | 处理 | 结果 |
|---|---|---|
| 尾数加完 ≥ 1(溢出) | 右规一次(阶码 +1) | 重新规格化,结果有效 |
| 右规后阶码超出上界 | — | 此时才是真正的浮点数上溢 |
所以"尾数溢出"只是中间状态,真正的"结果溢出"取决于右规后阶码是否越界。Ⅳ 正确。
综合
| 命题 | 判断 | 关键依据 |
|---|---|---|
| Ⅰ | ✓ | 对阶只是把小阶变成已存在的大阶,不会越界 |
| Ⅱ | ✓ | 右规直接 +1;舍入进位 → 二次右规 → 也 +1 |
| Ⅲ | ✓ | 左规阶码 −1,可能跌出下界 |
| Ⅳ | ✓ | 尾数溢出可被右规化解,并不必然导致浮点上溢 |
四项全对。
最终答案是 D(Ⅰ、Ⅱ、Ⅲ、Ⅳ)。
速记:
- 对阶看齐合法值 → 阶码不溢
- 右规 +1,左规 −1 → 都可能越界
- 舍入进位会触发二次右规 → 也归到"右规上溢"账上
- 尾数溢出 ≠ 浮点溢出 → 中间状态可补救