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

浮点数和IEEE754

重要度 ⭐⭐⭐⭐⭐IEEE754规格化阶码尾数单精度双精度
速查
单精度 1 符号 + 8 阶码 + 23 尾数,规格化数含隐含前导 1(实际 24 位精度);偏置 单 127 / 双 1023,存储阶码 = 真阶码 + Bias;阶码全 0 = 非规格化/0,全 1 = ∞/NaN。值 = $(-1)^S imes 1.M imes 2^{E-127}$。

概述

浮点数是表示实数的方法,小数点位置可浮动。IEEE 754 是现代计算机普遍采用的浮点数标准,定义了单精度(32 位)、双精度(64 位)等格式。

浮点数的基本表示

表示形式

$$N = (-1)^S \times M \times R^E$$

  • $S$:符号位(0 正 1 负)
  • $M$:尾数(Mantissa),定点小数
  • $E$:阶码(Exponent),定点整数
  • $R$:基数(通常为 2)

示例

$$+101.11_2 = +0.10111 \times 2^3$$

$S=0$,$M=0.10111$,$E=3$,$R=2$

浮点数的规格化

  • 目的:使尾数最高有效位为 1(最大化精度)。
  • 左规:尾数左移,阶码减小,直到最高位为 1。
  • 右规:尾数右移,阶码增大,用于处理溢出。

IEEE 754 标准

格式定义

单精度(float,32 位)

| S(1位) | E(8位) | M(23位) |
|--------|--------|---------|
| 31     | 30-23  | 22-0    |

双精度(double,64 位)

| S(1位) | E(11位) | M(52位) |
|--------|---------|---------|
| 63     | 62-52   | 51-0    |

扩展精度(80 位)

| S(1位) | E(15位) | M(64位,含1位显式整数位) |

隐含位(隐藏 1)

  • 规格化数的尾数默认最高位为 1,不存储
  • 实际尾数 = 1.M(单精度 1+23 位,双精度 1+52 位)。
  • 这样 23 位尾数实际精度为 24 位。

阶码的偏移值(Bias)

  • 单精度:$\text{Bias} = 127$($2^7-1$);双精度:$\text{Bias} = 1023$($2^{10}-1$)。
  • 实际阶码 = 存储值 − Bias;存储值 = 实际阶码 + Bias。

特殊值

类型阶码 E尾数 M
规格化数1 ~ 254任意$(-1)^S \times 1.M \times 2^{E-127}$
非规格化数0$\neq 0$$(-1)^S \times 0.M \times 2^{-126}$
$\pm 0$00$\pm 0$
$\pm\infty$2550$\pm\infty$
NaN255$\neq 0$非数

非规格化数(Denormalized)

  • 阶码全 0、尾数非 0,没有隐含的 1
  • 用于表示非常接近 0 的数。
  • 最小非规格化数:$\pm 2^{-149}$(单精度)。

浮点数转换实例

十进制 → IEEE 754 单精度

例:$-6.625_{10}$

  1. 转二进制:$-6.625 = -110.101_2$。
  2. 规格化:$-1.10101 \times 2^2$。
  3. $S = 1$(负数)。
  4. $E = 2 + 127 = 129 = 10000001_2$。
  5. $M = 10101000000000000000000$(23 位,隐含的 1 不存)。

结果:1 10000001 10101000000000000000000,十六进制:C0D40000

IEEE 754 → 十进制

例:0 10000010 01100000000000000000000

  1. $S = 0$(正数)。
  2. $E = 10000010_2 = 130$,实际阶码 $= 130 - 127 = 3$。
  3. $M = 0110000\ldots$,实际尾数 $= 1.011_2$。
  4. 值 $= 1.011 \times 2^3 = 1011_2 = 11_{10}$。

浮点数的运算

加减运算步骤

  1. 对阶:小阶向大阶看齐(尾数右移,阶码增大)。
  2. 尾数加减
  3. 规格化:左规(结果尾数太小,左移直到最高位为 1);右规(结果溢出,右移 1 位,阶码 +1)。
  4. 舍入
  5. 溢出判断(阶码溢出)。

对阶详解

例:$1.01 \times 2^3 + 1.10 \times 2^1$

  • 小阶向大阶看齐:$1.10 \times 2^1 = 0.0110 \times 2^3$。
  • 尾数相加:$1.0100 + 0.0110 = 1.1010 \times 2^3$。

舍入方法

  • 0 舍 1 入:类似四舍五入,舍去位 $\geq 1$ 则末位 +1。
  • 恒置 1:右移后末位恒置 1。
  • 截断法:直接截断,最简单但误差最大。
  • 就近舍入(Round to nearest):IEEE 754 默认,四舍六入五取偶。

溢出判断

  • 阶码上溢:阶码 $>$ 最大值 → 结果为 $\pm\infty$。
  • 阶码下溢:阶码 $<$ 最小值 → 结果为 0 或非规格化数。

精度问题

经典精度陷阱

  • $0.1 + 0.2 \neq 0.3$(在 IEEE 754 中)。
  • $0.1_{10} = 0.0001100110011\ldots_2$(无限循环小数)。
注意存储时截断,产生精度损失 —— 这是浮点数的固有性质,不是 bug。

单精度 vs 双精度

特性单精度双精度
总位数3264
有效位数24 位(约 7 位十进制)53 位(约 15 位十进制)
指数范围-126 ~ +127-1022 ~ +1023
Bias1271023

浮点数表示范围

单精度

  • 最大规格化数:$\pm(2-2^{-23}) \times 2^{127} \approx \pm 3.4 \times 10^{38}$。
  • 最小规格化数:$\pm 1.0 \times 2^{-126} \approx \pm 1.2 \times 10^{-38}$。
  • 最小非规格化数:$\pm 2^{-149} \approx \pm 1.4 \times 10^{-45}$。

易错点

  1. IEEE 754 规格化数有隐含的 1,不要忘记。
  2. 阶码用移码表示(偏移值 127 或 1023),不是补码。
  3. 对阶是小阶向大阶看齐(右移),不是大阶向小阶。
  4. 阶码全 0 和全 1 有特殊含义。
  5. 浮点数范围比整数大,但精度有限。
  6. $0.1+0.2 \neq 0.3$ 是精度问题,不是 bug。
  7. 非规格化数没有隐含的 1(0.M 而非 1.M)。

记忆卡片

单精度 IEEE 754 几位?偏置?
1(S) + 8(E) + 23(M);Bias = 127;存储阶码 = 真阶码 + 127。
隐含前导 1 是什么意思?
规格化数尾数最高位恒为 1 故不存储,实际尾数 1.M,23 位尾数实为 24 位精度。
阶码全 0 / 全 1 特殊含义?
全 0:0 或非规格化数(0.M×2⁻¹²⁶);全 1:∞(M=0)或 NaN(M≠0)。
-6.625 的 IEEE 754 单精度?
-110.101 = -1.10101×2²;S=1,E=2+127=129=10000001,M=10101000…(23 位)→ C0D40000。
0.1+0.2 为何≠0.3?
0.1 二进制无限循环,存储截断产生误差 —— 精度问题。

交互动画 · IEEE 754 单精度位域

32 位单精度:S(1) + E(8) + M(23),Bias=127,规格化值 = (-1)^S × 1.M × 2^(E-127) 31(S)3023220 0 00000000 符号 S阶码 E(8 位,移码) 尾数 M(23 位,隐含前导 1):00000000000000000000000 橙色竖虚线 = 符号边界,紫色竖虚线 = 阶码/尾数边界。 阶码全 1(11111111)→ ∞/NaN;全 0(00000000)→ 0/非规格化数(无隐含 1)。
点击示例,观察 32 位位域与 S / E / M 分段
点击按钮开始

相关知识点

fixed-point-representation ieee754-floating-point

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