精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

浮点数运算

大纲定位

二(四)2 浮点数的加/减运算

要求:掌握对阶、尾数求和/差、规格化、舍入四步,并能判断各步是否引起溢出。大纲这一条只到"加/减"为止,不含乘除。

考情分析

408 的题型只有单项选择题综合应用题两类。浮点加减目前以 2 分选择题出现,考法集中在两类:① 叙述判断——四步中每一步对阶码/尾数的影响,哪一步可能引起上溢或下溢;② 给定阶码尾数完整走一遍并判断最终是否溢出(这一步最容易在流程跑完后忘记核)。

浮点加减运算步骤

浮点加减法分为四步,顺序不能颠倒:

对阶尾数运算规格化舍入(+ 溢出判断)

第一步:对阶

两个浮点数 A=MA×2EAB=MB×2EB。只有阶码相同时尾数才能直接加减。

原则:小阶向大阶看齐。

EA<EB,则 A 的尾数右移 EBEA 位,阶码变为 EB

为什么不是大阶向小阶?尾数左移会丢失高位有效数字,而右移只丢失低位,精度损失更小且可通过舍入弥补。

WARNING

右移时符号位保持不变(算术右移),移出的低位需要保留,用于后续舍入。

第二步:尾数加减

对阶后两数阶码相同,直接对尾数执行补码加法或减法:

M=MA±MB

与定点补码加减法完全相同,符号位参与运算。

第三步:规格化

运算结果可能不满足规格化条件,需要调整。

左规:结果绝对值太小(如 0.0xxx),尾数左移,阶码减 1,直到最高有效位为 1。左规可能执行多次。

右规:尾数加法产生溢出(双符号位不同,如 01.xxx10.xxx),尾数右移 1 位,阶码加 1。右规最多做一次。

补码下的规格化判定:

正数:0.1xxx负数:1.0xxx

即符号位与最高数值位不同。若相同(0.0xxx1.1xxx),则需要左规。

第四步:舍入与溢出判断

对阶右移和右规都会移出低位数据,需要舍入处理。

舍入方式规则特点
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 入的进位可能使尾数再次溢出,此时需要额外做一次右规。

溢出判断发生在阶码上:

  • 上溢:规格化后阶码超过最大值(如单精度 E>254),结果为 ±
  • 下溢:阶码低于最小值,结果按非规格化数处理或置零

尾数溢出不等于结果溢出——尾数溢出可以通过右规修正。

哪一步会引起哪种溢出

叙述判断题几乎全部落在这张表上。判断依据只有一条:这一步把阶码往哪个方向动了。

步骤阶码怎么动可能上溢可能下溢
对阶小阶到大阶,结果阶码 = 两者中的大阶
尾数加减不动阶码
左规每次减 1(可能多次)
右规加 1(最多一次)
舍入末位进位可能导致尾数再次溢出 再右规,阶码加 1

对阶为什么绝不会溢出

这一条常被怀疑,因为对阶时尾数在动。但看阶码:对阶只是把小的那个阶码抬到大的那个阶码,结果阶码等于原来两个阶码中较大的一个。

E对阶后=max(EA, EB)

两个操作数本来就是合法浮点数,它们的阶码都在表示范围内,取其中较大的那个当然也在范围内。对阶不产生任何新的阶码值,所以既不会上溢也不会下溢。

真正被牺牲的是尾数精度(右移移出低位),不是阶码。

舍入也能引起上溢,别只盯着右规

这是四条判断里最容易漏的一条。舍入本身只碰尾数,但进位可能把尾数顶溢出

1.11111 末位进位 10.0000 必须右规 1.0000, E+1

阶码就这样被舍入间接推高了一格。如果原本阶码已是最大值,这一格就溢出了。

所以"右规和尾数舍入都可能引起阶码上溢"是正确说法。

尾数溢出 ≠ 结果溢出:尾数加减产生的溢出(双符号位 01.xxx10.xxx)是可以靠右规救回来的——右移一位、阶码加 1 就恢复了。只有阶码超出范围才是真溢出。反过来,尾数溢出后右规导致阶码上溢,那才是结果溢出。

交互可视化

加载可视化中...

例题

例 1:设浮点数格式为阶码 4 位(补码)、尾数 6 位(补码,双符号位),计算 A+B

A:阶码 [EA]=0101(真值 +5),尾数 [MA]=00.11011

B:阶码 [EB]=0011(真值 +3),尾数 [MB]=00.10111

对阶ΔE=53=2B 阶码小,MB 右移 2 位:

MB00.0010111(下划线部分移出)

阶码统一为 0101

尾数相加

00.11011+00.00101=01.00000

双符号位 01 00,尾数溢出。

右规:右移 1 位,阶码加 1。

01.0000000.10000,E=0101+1=0110(+6)

舍入:右规移出位为 0,无需进位。

溢出判断:阶码 +6 在正常范围内。

结果0.10000×26=1000002=32

验证:A=0.11011×25=110112=27(精确值),B=0.10111×23=101.112=5.75,真值和 A+B=32.75;机器结果 32 是对阶时 B 的低位 11(即 0.75)被移出舍弃所致,结果合理。

例 2:IEEE 754 单精度,A=1.5B=0.125,求 A+B

A=1.12×20EA=127

B=1.02×23EB=124

对阶:B 尾数右移 3 位,1.0000.001

尾数相加:1.100+0.001=1.101

已规格化,无需调整。结果 = 1.101×20=1.625

浮点乘除法(超纲·选读)

不在现行大纲内

大纲「二(四)浮点数的表示和运算」只有「1. 浮点数的表示(IEEE 754 标准)」和「2. 浮点数的加/减运算」两条,不含乘除;主教材对应小节也标为选讲。

本节保留的理由是它能把「阶码是移码」这件事讲透——两个移码相加会多算一个偏置量,必须减掉。理解了这一点,回头看加减法里的对阶和 IEEE 754 的阶码设计会更顺。但它不是考点,复习时间紧就跳过。

浮点乘除法不需要对阶,直接操作阶码和尾数:

A×B:E=EA+EBbias,M=MA×MBA÷B:E=EAEB+bias,M=MA÷MB

乘除后同样需要规格化和舍入。

数值例 1(补码/无偏置阶码体系)A=0.1100×2010B=0.1010×2001(尾数 4 位),求 A×B

  • 阶码相加:E=010+001=011
  • 尾数相乘:0.1100×0.1010=0.01111000
  • 规格化:尾数首位无效,左规 1 位 → 0.1111000,阶码减 1 → E=010
  • 取 4 位尾数:0.1111(低位为 0,无舍入损失)

结果 0.1111×2010=0.9375×4=3.75。验证:A=3B=1.253×1.25=3.75

数值例 2(IEEE 754 移码阶码体系)A=1.5B=2.5(单精度),求 A×B

  • A=1.12×20EA=127B=1.012×21EB=128
  • 阶码:E=EA+EB127=128(真值 1)——这里必须减 bias,否则偏置被算了两次
  • 尾数:1.1×1.01=1.111(即 1.5×1.25=1.875),已规格化

结果 1.1112×21=11.112=3.75

两个例子答案相同,但阶码处理完全不同——这就是上面"先看清阶码体系"的意义。

公式的适用体系

上面两个公式针对 IEEE 754 这类移码(带偏置)阶码:移码相加会多出一个 bias 所以要减掉,相减会消掉 bias 所以要加回。若题目阶码用补码表示(本文前面的对阶例题就是补码阶码体系),直接 E=EA+EBE=EAEB,不涉及 bias。先看清题目用哪套阶码再套公式。

考点清单

  • [ ] 浮点加减四步:对阶 → 尾数运算 → 规格化 → 舍入
  • [ ] 对阶规则:小阶向大阶对齐(尾数右移)
  • [ ] 规格化条件:补码下符号位与最高数值位不同
  • [ ] 左规可能多次,右规最多一次
  • [ ] 0 舍 1 入的舍入规则,舍入后可能需再次右规
  • [ ] GRS(保护位/舍入位/粘位)用于提高舍入精度,就近舍入是 IEEE 754 的默认模式
  • [ ] 溢出判断在阶码上:阶码超范围才是真溢出
  • [ ] 对阶不会引起任何溢出——结果阶码 = 两个阶码中的较大者,不产生新值
  • [ ] 左规可能下溢(阶码减);右规可能上溢(阶码加)
  • [ ] 舍入也可能引起上溢——进位顶溢尾数后要再右规,阶码跟着加 1
  • [ ] 尾数溢出不一定是结果溢出,右规可以救回来

真题练习

相关真题(3题)