首页/计算机组成原理/02-data-representation/浮点数加减运算 🔗 在 Obsidian 中打开
计算机组成原理 · 02-data-representation

浮点数加减运算

重要度 ⭐⭐对阶规格化舍入溢出判断
速查
五步:对阶 → 尾数运算 → 规格化 → 舍入 → 溢出判断。对阶:小阶向大阶看齐(小阶尾数右移);规格化:尾数溢出→右规(阶码+1),前导零过多→左规(阶码-1);阶码上溢→$\pm\infty$,下溢→机器零。

核心概念

浮点数加减运算是计算机中最复杂的算术运算之一,核心步骤为:对阶 → 尾数运算 → 规格化 → 舍入 → 溢出判断

浮点数加减运算五步骤

输入:$X = M_x \times 2^{E_x}$,$Y = M_y \times 2^{E_y}$

  1. 对阶:使 $E_x = E_y$。
  2. 尾数运算:$M_x \pm M_y$。
  3. 规格化:调整尾数和阶码。
  4. 舍入处理:截断或舍入。
  5. 溢出判断:阶码是否上溢/下溢。

浮点数表示格式

字段说明IEEE 754 单精度IEEE 754 双精度
符号位 S0 正 1 负1 位1 位
阶码 E移码表示8 位11 位
尾数 M原码表示23 位52 位

关键定义表格

对阶操作

步骤说明
求阶差$\Delta E = E_x - E_y$
对阶原则小阶向大阶看齐(阶码小的尾数右移)
右移位数$|\Delta E|$ 位
阶码调整小的阶码增大到与大的相同

规格化操作

类型条件操作
左规尾数非规格化(如正数 0.0xxx... 或负数补码 1.1xxx...)尾数左移,阶码减 1
右规尾数溢出(如 1x.xxxxx)尾数右移,阶码加 1
规格化形式0.1xxxx...(正数)或 1.0xxxx...(负数补码)

溢出判断

情况条件结果
阶码上溢阶码 > 最大正值正溢出/负溢出(异常)
阶码下溢阶码 < 最小负值结果为 0(机器零)
正常阶码在正常范围内正常结果

手算示例

示例 1:浮点数加法完整流程

题目:设浮点数格式:阶码 4 位(移码),尾数 8 位(补码)。计算 $X + Y$:$X = 0.1101100 \times 2^{011}$,$Y = 0.1011000 \times 2^{001}$。

步骤 1:对阶

  • $E_x = 011 = 3$,$E_y = 001 = 1$,$\Delta E = 3 - 1 = 2$。
  • 小阶向大阶看齐:Y 的阶码变为 3,尾数右移 2 位:$Y' = 0.0010110 \times 2^{011}$。

步骤 2:尾数加法

  0.1101100  (X的尾数)
+ 0.0010110  (Y的尾数)
-----------
  1.0000010  (结果)

步骤 3:规格化

  • 结果尾数 = 1.0000010,两个正数相加结果 $\geq 1$,属于尾数溢出,需要右规。
  • 右规:尾数右移 1 位变为 0.1000001,阶码加 1 变为 $011+1=100$,在正常范围内,未溢出。

步骤 4:舍入:此处无舍入问题。

步骤 5:溢出判断:阶码 = 100(即 4),无溢出。

结果:$0.1000001 \times 2^{100} = 0.1000001 \times 2^4$(规格化后)。

示例 2:需要右规的情况

$X = 0.1100000 \times 2^2$,$Y = 0.1010000 \times 2^2$:阶码相同无需对阶;尾数相加 $0.1100000 + 0.1010000 = 1.0110000$ 溢出,右规:尾数右移 1 位、阶码加 1,结果 $0.1011000 \times 2^3$。

示例 3:需要左规的情况

$X = 0.1010000 \times 2^3$,$Y = 0.1001000 \times 2^3$:尾数相减 $0.1010000 - 0.1001000 = 0.0001000$ 前导零过多,左规:尾数左移 3 位、阶码减 3,结果 $0.1000000 \times 2^0$,未下溢。

示例 4:溢出判断

阶码 8 位(移码,偏置值 127),某次运算后阶码 = 11111111(255):真值 $= 255 - 127 = 128$,超过单精度阶码范围 -126 ~ +127,阶码上溢,结果为 $\pm\infty$。

示例 5:对阶过程尾数右移丢失精度

$X = 0.1 \times 2^5$,$Y = 0.1000000001 \times 2^1$,尾数 8 位:对阶 Y 尾数右移 4 位得 $Y' = 0.00001000 \times 2^5$(低位丢失),对阶可能造成精度损失,所以小阶向大阶看齐(减少移位次数)。

常见考法

  1. 完整流程手算:给定两个浮点数,逐步计算加减结果。
  2. 对阶操作:判断谁向谁看齐,移几位。
  3. 规格化判断:结果是否需要左规或右规。
  4. 溢出判断:阶码是否超出范围。
  5. IEEE 754 格式计算:结合具体编码格式。

易错点

  1. 对阶方向错误:必须是小阶向大阶看齐,不是大阶向小阶。
  2. 左规右规混淆:尾数溢出 → 右规,前导零过多 → 左规。
  3. 规格化形式搞错:正数 = 0.1xxx...,负数补码 = 1.0xxx...。
  4. 阶码溢出未判断:加减后阶码可能超出范围。
  5. 对阶后忘记调整阶码:小阶的阶码要增大到与大阶相同。
  6. 舍入方式:截断法(恒舍)和 0 舍 1 入法结果不同。

核心结论

  1. 对阶小阶看齐大阶:减少移位次数,降低精度损失。
  2. 规格化保证精度:消除前导零/前导一。
  3. 右规可能溢出:右规时阶码 +1,可能上溢。
  4. 左规可能下溢:左规时阶码 -1,可能下溢变 0。
  5. 精度损失不可避免:对阶右移丢失低位,舍入误差。
  6. IEEE 754 偏置值:单精度 127,双精度 1023。

记忆卡片

浮点数加减运算的五个步骤?
对阶 → 尾数运算 → 规格化 → 舍入 → 溢出判断。口诀:"对尾规舍溢"。
对阶的原则?为什么?
小阶向大阶看齐。大阶变小阶尾数左移可能丢高位有效数字;小阶变大阶只丢低位,误差较小。
何时左规、何时右规?
左规:前导零/前导一过多(0.001xxx 或 1.110xxx),尾数左移、阶码 -1;右规:尾数溢出(1x.xxxxx),尾数右移、阶码 +1。
阶码上溢和下溢怎么处理?
上溢:异常/中断,结果为 $\pm\infty$;下溢:结果为机器零(0)。
对阶导致什么问题?
小阶尾数右移低位数据丢失,精度损失。应尽量减少对阶移位次数。

交互动画 · 对阶与规格化(示例 1)

尾数 8 位(含符号位),右侧为阶码(移码) X 尾数 Y 尾数 和 R 01101100 01011000 ········ E=011 E=001 E= Y 尾数末两位被移出(对阶精度损失) 示例 1:X = 0.1101100×2^011,Y = 0.1011000×2^001,ΔE = 2 相加 0.1101100 + 0.0010110 = 1.0000010(溢出)→ 右规 0.1000001×2^100
按步骤演示:对阶 → 尾数相加 → 规格化
点击按钮开始

相关知识点

fixed-and-floating-point overflow-detection

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。