1. 笔记/

LLM 量化精读笔记 · 01 数值编码与计算机表示基础(信息论 · 整数 · IEEE 754 · 舍入与截断)

定位:前置知识章。量化本质上是在回答"一个数用多少 bit、以什么格式表示"——所以它站在三块地基之上:信息论(bit 是什么、能压缩到什么程度)、编码(整数/浮点在硬件里怎么编码)、计算机组成(为什么位宽直接决定性能)。本章把这三块地基一次性补齐,全部内容都以"服务于后面的量化推导"为取舍标准。 对应:MIT 6.5940 Lecture 5 开头的数据类型总览;Inference Engineering Ch5 的 Number Formats 前情;经典教材 IEEE 754 部分。 学完本章你应该能:① 说出 b bit 能表示多少种取值、均匀分布的熵是多少;② 手写 4-bit 补码并解释为什么用补码;③ 手算一个数的 FP32/FP16 位模式,解释 exponent bias、次正规数、machine epsilon;④ 分清 6 种舍入模式,并解释为什么量化用 round-half-even;⑤ 分清"截断(truncation)“和"饱和(clamp)",并证明截断噪声是舍入的 4 倍。


目录(本章) #

  1. 本章目标
  2. 信息论三件套:bit、熵、率失真
  3. 整数表示
  4. 定点数与 scale 的世界
  5. IEEE 754 浮点数
  6. 舍入(Rounding)
  7. 截断(Truncation)与饱和(Clamp)
  8. 计算机组成视角:为什么 bit 少就快
  9. 预备知识$\to$量化概念映射表
  10. 习题与解答
  11. 延伸阅读

1. 本章目标 #

用一句话概括本章的位置:

量化的全部数学(02 章)都在做一件事:把一个实数 r 用"有限个 bit"表示出来;而"有限个 bit 能表示什么、表示得有多准、代价是什么"正是本章的内容。

后面的章节会频繁用到本章的四个结论,先记住它们:

  1. b bit 只有$2^b$种位模式——这是所有压缩的起点。
  2. 整数用补码表示,INT8 的范围是 [−128, 127]——量化公式里的 qmin/qmax 就是从这来的。
  3. 浮点 = 符号位 + 偏置指数 + 尾数,指数位换动态范围、尾数位换精度——FP16/BF16/FP8 的全部区别都在这句话里。
  4. 舍入误差 ≤ 半步长($\Delta /2$),截断误差 ≤ 一步长($\Delta$)且噪声功率是舍入的 4 倍——所以量化默认"四舍五入"而不是"直接砍掉”。

2. 信息论三件套:bit、熵、率失真 #

2.1 bit:信息的基本单位 #

一个 bit 有两种状态(0/1)。b 个 bit 可以组成 $2^b$ 种不同的位模式:

$b = 1 \to 2$种取值$b = 4 \to 16$种取值 $b = 8 \to 256$种取值$b = 16 \to 65,536$种取值

这就是量化格式表里"Distinct Values Representable"($FP16/BF16 = 65,536$,$FP8 = 256$,$FP4 = 16$)的来历。位宽 b 直接决定了"码本"(codebook)的大小。

信息量的定义(Shannon):一个概率为 p 的事件,其信息量为

$I = -\log_2(p)$(单位:bit)

直觉:p 越小,事件越"意外",信息量越大。log2 让"两个独立事件合起来的信息量 = 各自信息量之和",这是 bit 取对数的根本原因。

2.2 熵:表示一个分布最少需要多少 bit #

一个随机变量 X 的熵(entropy)是它的平均信息量:

$$ H(X) = -\sum _i p_{i} \cdot \log_2(p_{i}) $$

熵是"无损压缩"的下界:用 b 个 bit 表示 X 的所有可能取值,如果 b < H(X) 就一定会有信息损失;如果$b \ge \lceil H\rceil$理论上可以做到无损。

两个极端:

分布H(bit)含义
均匀分布在$2^b$个值上b每个值等概率,无法压缩
$P(0)=0.9, P(1)=0.1$≈ $0.469$大量冗余,理论上 1 bit 足够甚至还可以进一步压缩

均匀分布时$H = b$,正好等于位宽。这就是为什么"均匀量化 + 均匀分布"是最理想的情形:码本没有浪费。

2.3 率失真:有损压缩的边界(直觉版) #

无损压缩的下界是熵 H;但量化是有损的。率失真理论回答:给定允许的失真 D,最小需要的速率 R(D) 是多少(R 随 D 增大而减小)。

对量化而言:

码本大小$2^b ↔$速率 b bit 量化误差$\varepsilon ^{2} ↔$失真 D

“每$bit \approx 6 dB$"(02 章会完整推导)本质就是均匀量化器的一条率失真曲线:速率每 +1 bit,失真(噪声功率)÷4,即 SNR +6 dB。

不需要掌握率失真定理的证明,但要建立这个直觉:量化是在"速率"和"失真"之间沿着一条曲线做交易,而不同的编码方式(均匀网格、非均匀网格、浮点)对应不同的曲线。 后续每一篇论文(GPTQ/AWQ/QuIP#…)都是在"同样的 b bit 预算下,把曲线往左上方推”。

2.4 信息论视角预演:outlier 问题 #

假设某个权重张量 90% 的值在$[-1, 1]$,10% 的值在$\pm 100$附近。它的熵其实不高(大部分值集中在小区间),但动态范围很大

如果用一个均匀网格覆盖$[-100, 100]$,绝大多数码字落在没人用的区域:

网格:  -100 ... -1 ... 0 ... 1 ... 100
实际值:       ████████████████
码字利用率:   ~1%(90% 的值挤在 1% 的码字里)

结果:正常值的有效位宽被 outlier 稀释(02 章算过:范围只用了 1/100,等效丢约 6.6 bit)。这就是 LLM.int8()、SmoothQuant、AWQ 要解决的同一个问题。先有信息论的框架,才能看懂他们为什么这么设计。


3. 整数表示 #

3.1 无符号整数(Unsigned) #

b bit 无符号整数表示$0 \sim 2^b - 1$:

4-bit 无符号:$0000=0, 0001=1, ..., 1111=15$

适合"天然非负"的量(地址、计数)。量化的非对称形式会用到它:值域$[0, 255]$对应无符号 INT8。

3.2 有符号整数:补码(Two’s Complement)——硬件唯一真解 #

b bit 补码表示范围:

$$ [-2^{b-1}, 2^{b-1} - 1] $$

4-bit 例子:

位模式补码值位模式补码值
011171000−8
001131101−3
000111111−1
000001001−7

求负数:按位取反 + 1

求 -5 的 4-bit 补码: $5 = 0101 \to$取反$1010 \to +1 \to 1011$(= $-5$)✓

为什么硬件用补码?三个原因:

  1. 加减法统一:$a - b = a + (-b)$,同一套加法器处理所有情况,不需要专门的减法器。
  2. 0 唯一:0000 和 1000 不会同时表示 0(原码/反码都有$\pm 0$问题,见 3.3)。
  3. 符号位自然融入:最高位就是符号位(1 为负),但不用单独判断,加法器自动处理。

记忆法:补码 = “取反加一”;最小的负数(1000)是"取反加一"自指(−8 的补码还是 1000),这是它比 7 多一个的原因。

3.3 原码 / 反码的坑(为什么被淘汰) #

编码表示 -0?4-bit 的 -0 位模式问题
原码(sign-magnitude)1000比较大小要判符号;$\pm 0$两个零
反码(ones’ complement)1111加法需要循环进位修正
补码加法统一、0 唯一

有意思的是:浮点数恰恰用的是"原码"思想(符号位 + 尾数绝对值),因为浮点运算不需要比较整数大小,而原码的对称性($\pm 0$)在浮点里是刻意保留的(见 5.3)。

3.4 溢出:饱和(Saturation)vs 环绕(Wraparound) #

INT8 的 127 + 1 会怎样?取决于硬件/软件策略:

环绕(wraparound):$127 + 1 = -128$(模$2^{8}$,补码天然行为) 饱和(saturation):$127 + 1 = 127$(clamp 到边界)

量化里的 clamp(q, qmin, qmax) 就是饱和。饱和牺牲一点动态范围,但不会让数值"跳到对面去"——这对神经网络非常重要:一个溢出变成 −128 的激活值会彻底破坏后续计算。

3.5 从整数编码到量化:qmin/qmax 的来源 #

量化公式里的量化值域直接来自整数编码:

INT8 无符号:$q \in [0, 255] \to$用于非对称量化 INT8 有符号:$q \in [-128, 127] \to$对称量化默认值域 对称量化的实际网格:$q \in [-127, 127]$(用$2^{b-1}-1$作分母时,-128 不参与)

以后看到"对称 INT8 用 127 做分母、有些 kernel 用 128"不要困惑——127 来自$2^{b-1}-1$(保证$\pm$对称且 0 精确),128 来自$2^{b-1}$(把补码的 −128 也用上)。两个约定各有拥趸,不影响原理。


4. 定点数与 scale 的世界 #

4.1 定点数(Fixed-Point) #

定点数 = 整数 + 一个固定的缩放因子 scale:

真实值 = 整数 q × scale s

Q 格式记法:Qm.n 表示 m 位整数 + n 位小数(如 Q1.7 表示 1 位整数位、7 位小数位,共 8 bit)。

4.2 量化就是"把浮点转定点" #

回看 02 章的对称量化公式:

$$ q = \operatorname{round}(r / s), \hat{r} = q \cdot s $$

这就是定点化的标准流程:除以$scale \to$取整$\to$乘回 scale。整数 q 就是定点表示,s 就是定点格式的步长。

定点算术的硬件含义:矩阵乘全部用整数乘加,累加器用 FP32(或 INT32)防溢出,最后再乘回 scale。Tensor Core 的整数/低精度浮点乘加单元就是干这个的。

记住这个等价:量化后的推理 = 定点矩阵乘 + 少量 scale 换算。所有"量化推理 kernel"的复杂性都来自怎么把 scale 运算塞进这条流水线(11 章讲 QServe 时深入)。


5. IEEE 754 浮点数 #

5.1 从科学计数法到二进制 #

十进制科学计数法:$3.75 = 1.875 \times 10^{1}$。二进制版本:

$$ 3.75 = 11.11_{2} = 1.111_{2} \times 2^{1} $$

浮点存储的就是这三个要素:符号、指数、尾数

5.2 FP32 位布局与手算 #

$FP32 = 1$位符号 + 8 位指数 + 23 位尾数(隐含 1 位前导 1,共 24 位有效精度):

值= $(-1)^s \times 1.m \times 2^{e - 127}$

其中 e 是指数字段(8 bit,无符号$0\sim 255$),$bias = 127$(指数是"偏置编码",excess-127)。为什么要 bias?让指数部分变成无符号整数,比较大小/排序更简单。

手算 −3.75

  1. 符号:负数$\to s = 1$
  2. $3.75 = 11.11_{2} = 1.111_{2} \times 2^{1} \to$指数真值= $1 \to e = 1 + 127 = 128 = 10000000_{2}$
  3. 尾数:111 后面补 20 个 0(23 位) 结果:1 10000000 11100000000000000000000 十六进制:0xC0700000

手算 0.1(演示"十进制小数转二进制不精确"):

$0.1 = 0.0001100110011001100110011..._{2}$(0011 无限循环) 规格化:$1.1001100110011... \times 2^{-4}$ 指数:$e = 127 - 4 = 123$ 尾数只取 23 位,第 24 位是$1 \to$舍入进位 结果:存储值= $0.100000001490116119384765625 \ne 0.1$

这就是"$0.1 + 0.2 \ne 0.3$“的根源:0.1 和 0.2 在二进制下都是无限循环小数,存储时已经被舍入。量化同理——先接受"表示本身就带误差”,才能理性地讨论"量化误差"。

5.3 特殊值、次正规数与 machine epsilon #

FP32 指数全 0 / 全 1 时进入特殊状态:

指数字段尾数字段含义
$e = 0$$m = 0$$\pm 0$有 +0 / −0(原码思想的残留)
$e = 0$$m \ne 0$次正规数(subnormal)$(-1)^s \times 0.m \times 2^{-126}$
$1 \le e \le 254$任意规格化数(normal)$(-1)^s \times 1.m \times 2^{e-127}$
$e = 255$$m = 0$$\pm \infty$溢出/除零
$e = 255$$m \ne 0$NaN0/0、√负 等非法运算

次正规数(denormal)存在的意义:让数值在接近 0 时"平滑下溢"而不是直接跳成 0(避免除以接近 0 的数时出现空洞)。代价是精度和速度都差一些。

machine epsilon:1 与下一个可表示的浮点数之间的距离:

$\varepsilon = 2^{-M}$,M 为尾数位数

$$ \begin{aligned} FP32: \varepsilon &= 2^{-23} \approx 1.19e-7 FP16: \varepsilon &= 2^{-10} \approx 9.77e-4 BF16: \varepsilon &= 2^{-7} \approx 7.81e-3 \end{aligned} $$

浮点数的相对精度≈ $\varepsilon /1$的量级:尾数每少 1 bit,相对精度减半

5.4 FP16 与 BF16:同一个 16 bit 预算,两种分配 #

格式符号指数尾数(含隐含位)bias最大正常值最小正常值$\varepsilon$
FP161511(10 存储)1565,504$2^{-14} \approx 6.1e-5$$2^{-10} \approx 9.8e-4$
BF16188(7 存储)127≈ $3.4e38$(同 FP32)$2^{-126}$(同 FP32)$2^{-7} \approx 7.8e-3$

关键对比:

FP16:指数$5 bit \to$范围小($\sim \pm 65k$),尾数$11 bit \to$精度高 BF16:指数$8 bit \to$范围同 FP32,尾数$8 bit \to$精度低(约 3 位十进制)

这解释了 Inference Engineering Ch5 的一句话:“exponent gives higher dynamic range than integers”——指数位多的格式能表示更大的数量级跨度,这在训练(梯度跨多个数量级)里极其重要;而推理时值域已知且稳定,可以牺牲范围换精度,于是 FP16 做推理默认格式、BF16 做训练主流。

5.5 动态范围 vs 精度:浮点格式的永恒 tradeoff #

位预算固定时: 指数位$↑ \to$动态范围 ↑、精度 ↓ 尾数位$↑ \to$精度 ↑、动态范围 ↓

这一条是 03 章"数值格式"的总纲:FP8 的 E4M3(指数 4、尾数 3)与 E5M2(指数 5、尾数 2)就是同一位预算下的两种分配;FP4(E2M1)是更极端的压缩。看到任何格式的名字(E×M×),第一反应就是算它的动态范围和精度。


6. 舍入(Rounding) #

6.1 为什么需要舍入 #

真实数在二进制下几乎总是无限精度的(比如 0.1),而存储/计算格式只有有限位。把高精度结果塞进有限位,有两个策略:

策略 A:舍入(round)——找最近的可用值$\to$误差 ≤ 半个格距 策略 B:截断(truncate)——直接砍掉低位$\to$误差可达一个格距

量化里的 round(r/s) 就是策略 A;int(r/s)(强制取整)是策略 B。

6.2 六种舍入模式 #

模式2.5−2.52.7−2.7
round-half-even(银行家舍入)2−23−3
round-half-away-from-zero3−33−3
round-half-up(向 +∞)3−23−2
truncation(向 0 截断)2−22−2
floor(向下取整)2−32−3
ceil(向上取整)3−23−2

6.3 为什么 IEEE 754 默认 round-half-even #

round-half-even 的规则:恰好落在两个整数正中间时,取偶数的那个

$2.5 \to 2$(2 是偶数)$3.5 \to 4$(4 是偶数)

$$ -2.5 \to -2 -3.5 \to -4 $$

为什么不用更"直觉"的 half-away-from-zero?

  1. 无偏性:half-away 对 +2.5 向上、−2.5 向下,在大数据量下误差会系统性偏向一侧(均值不为 0);half-even 正负对称、期望误差为 0。
  2. 避免累积漂移:金融/科学计算里大量求和时,系统性偏差会线性累积;half-even 让误差在统计上相互抵消。

量化里的意义:模型有上亿次量化/反量化,任何系统性偏差都会被放大,所以默认用无偏舍入。PyTorch 的 torch.round、NumPy 的 np.round 都是 half-even;CUDA 的 __float2int_rn 也是 round-to-nearest-even。部分量化库(如 bitsandbytes)用 round-to-nearest(half-away),实际影响通常很小,但做严格对比实验时要注意复现性。

补充:训练里还有一种随机舍入(stochastic rounding):以概率往上下取整,期望值恰好等于原数。它在 QAT 里用于去掉量化噪声的偏差(09 章会再见到)。

6.4 舍入的误差界 #

当 r 落在量化范围内时:

$$ |\varepsilon_{ ext{round}}| \le \Delta /2 $$

且假设误差在$[-\Delta /2, \Delta /2]$均匀分布时:

$$ E[\varepsilon ] = 0, Var[\varepsilon ] = \Delta ^{2}/12 $$

这是 02 章 6 dB/bit 推导的出发点。舍入 = 无偏 + 最小噪声,所以量化默认舍入而不是截断。


7. 截断(Truncation)与饱和(Clamp) #

7.1 截断 vs 舍入:噪声功率差 4 倍 #

向 0 截断(truncation toward zero):正数误差落在$[0, \Delta )$,负数误差落在$(-\Delta , 0]$。

对对称分布的信号:

截断:$Var[\varepsilon ] = \Delta ^{2}/3$ 舍入:$Var[\varepsilon ] = \Delta ^{2}/12$ 比值:4 倍= $6 dB$

所以"能舍入就别截断"——截断白白损失 6 dB(约等于 1 bit)。这也是为什么 int(x) 直接砍小数位做量化是坏习惯。

单侧分布(比如全正的激活),截断还有系统性偏差:

所有正值的$\hat{r} \le r \to E[\varepsilon ] = +\Delta /2$(输出系统性偏小)

这种偏差在深层网络里会累积成可观察的质量问题。

7.2 术语澄清:两种"截断" #

中文/英文里"截断"有两个容易混淆的含义:

术语英文含义在量化里的角色
位截断truncation丢弃低位 bit(向 0 取整)坏习惯,噪声 4 倍
值域截断clamping / saturation超出 [rmin, rmax] 的值压到边界02 章的$\varepsilon_{ ext{clip}}$,outlier 的锅

02 章说"量化误差 = 舍入 + 截断",那个"截断"其实是 clamping(值域饱和),不是位截断。 分清这两个词,读论文才不会晕。

7.3 clamp 的误差特征 #

$\varepsilon_{ ext{clip}} = r - r_{\max}$(当 r > rmax)或 r - rmin(当 r < rmin)

关键性质:

  1. 与位宽无关:bit 再多,边界外的值照样被压到边界。
  2. 可任意大:outlier 离边界越远,误差越大。
  3. 有方向性:全部压向边界,均值不为 0。

所以量化器设计的第一课是:范围(rmin/rmax)选择比舍入模式重要得多——舍入只决定$\Delta /2$以内的精细误差,范围决定会不会出现灾难性截断(04 章专门讲校准与范围选择)。


8. 计算机组成视角:为什么 bit 少就快 #

8.1 存储层次与数据搬运 #

现代 GPU/CPU 的存储层次(从快到慢):

寄存器(几 KB)$\to L1$(几十 KB)$\to L2$(几 MB)$\to$共享/显存 HBM(几十 GB) 延迟递增、带宽递减、容量递增

LLM 推理 decode 阶段的本质是:每个 token 都要把权重从 HBM 搬一遍。70B 模型 FP16 权重= $140 GB$,一次 forward 要搬运 140 GB——带宽成了瓶颈,算力反而用不满。

8.2 位宽如何变成性能 #

权重位宽减半($FP16 \to FP8$): 同一次搬运的数据量减半$\to$等效带宽翻倍 HBM 能量消耗近似减半 低精度 Tensor Core 的 FLOPS 翻倍($Hopper FP8 = 2x FP16$)

常被引用的 Horowitz(ISSCC 2014)能量数量级:一次 32-bit DRAM 访问的能量(数百 pJ 量级)比一次 32-bit 整数乘加(几 pJ 量级)高约两个数量级。结论:推理性能瓶颈在"搬数据"而不是"算数",而量化是唯一能直接减少数据搬运量的手段。

8.3 Tensor Core 预告 #

Tensor Core 是 GPU 上的低精度矩阵乘专用单元:一次指令算一块小矩阵(如 16×16×16),支持 FP16/FP8/INT8 等格式。位宽决定它能塞进多少元素(FP16 塞 16 个,FP8 塞 32 个),这就是"FP8 的 FLOPS 是 FP16 的两倍"的硬件原因。03 章讲数值格式时会展开。


9. 预备知识 → 量化概念映射表 #

本章概念对应的量化概念后续章节
$b bit \to 2^b$个码字$FP16=65,536 / FP8=256 / FP4=16$种取值02、03
熵、率失真均匀量化浪费位、非均匀量化动机、6 dB/bit02、06
补码$q \in [-2^{b-1}, 2^{b-1}-1]$qmin/qmax、对称 INT8 的 127 vs 12802
定点数 = 整数 × scale量化公式$q = \operatorname{round}(r/s)$、$\hat{r} = q\cdot s$02、11
IEEE 754:指数换范围、尾数换精度FP16 vs BF16、FP8 E4M3 vs E5M203
machine epsilon浮点格式的相对精度(FP8 风险来源)03
round-half-even 无偏量化默认舍入、误差≤ $\Delta /2$02
truncation 噪声$\Delta ^{2}/3 vs$舍入$\Delta ^{2}/12$为什么不能 int() 硬截断02
clamp(饱和)$\varepsilon_{ ext{clip}}$、outlier 截断误差02、04、07
存储层次、数据搬运位宽 = 带宽 = 性能(30–50% 收益的来源)03、11

10. 习题与解答 #

题 1(手算):补码 #

写出 4-bit 补码中 −6、−1、0、5 的位模式;验证 −(−6) 用"取反 + 1"能回到 6。

题 1 解答

$6 = 0110 \to$取反$1001 \to +1 \to 1010$(−6)。 $-1 = 0001 \to 1110 \to 1111$。 $0 = 0000$。 $5 = 0101$。 验证:1010(−6)取反$0101 \to +1 \to 0110 = 6 ✓$。

题 2(手算):浮点位模式 #

(a) 把 3.5 写成 FP32 位模式(十六进制)。 (b) 把 −0.75 写成 FP32 位模式。 (c) 把 1.5 写成 FP16 位模式。

题 2 解答

(a) $3.5 = 11.1_{2} = 1.11_{2} \times 2^{1}$。$s=0$,$e=128=10000000_{2}$,$m=11000...0 \to$0 10000000 11000000000000000000000= $0x40600000$。

(b) $0.75 = 0.11_{2} = 1.1_{2} \times 2^{-1}$。$s=1$,$e=127-1=126=01111110_{2}$,$m=1000...0 \to$1 01111110 10000000000000000000000= $0xBF400000$。

(c) $FP16 bias=15$。$1.5 = 1.1_{2} \times 2^{0}$。$s=0$,$e=15=01111_{2}$,$m=10 0000 0000 \to$0 01111 1000000000= $0x3E00$。

题 3(填表):舍入模式 #

对 1.5、−1.5、2.3 分别填出 6 种舍入模式的结果。

题 3 解答
模式1.5−1.52.3
half-even2−22
half-away2−22
half-up2−12
truncation1−12
floor1−22
ceil2−13

题 4(计算):熵 #

(a) 分布 {0.5, 0.25, 0.25} 的熵是多少?与 2-bit 均匀分布比较。 (b) 一个 8-bit 均匀量化器,码本 256 个值;如果实际值只有其中 16 个等概率取值,熵是多少?这说明什么?

题 4 解答

(a) $H = -0.5\cdot \log_2(0.5) - 0.25\cdot \log_2(0.25) - 0.25\cdot \log_2(0.25) = 0.5 + 0.5 + 0.5 = 1.5 bit$。2-bit 均匀分布熵= $2 bit$。前者用 1.5 bit 理论上就够,直接 2-bit 编码浪费 0.5 bit/样本。

(b) 16 个等概率取值$\to H = \log_2(16) = 4 bit$。说明 256 个码字里 240 个是浪费的,等效只有 4 bit 的有效信息——量化器设计应该让"码本尽量贴着真实分布"(非均匀/分组动机,04/06 章)。

题 5(推导):截断噪声是舍入的 4 倍 #

设均匀量化步长$\Delta$,信号足够随机且无截断。证明向 0 截断的噪声功率(对称分布输入下)是舍入的 4 倍。

题 5 解答

舍入误差均匀分布在$[-\Delta /2, \Delta /2]$:$Var = \Delta ^{2}/12$。

向 0 截断:正值误差均匀分布在$[0, \Delta )$,负值误差均匀分布在$(-\Delta , 0]$。对称输入下$E[\varepsilon ]=0$,$E[\varepsilon ^{2}] = (1/\Delta )\int _{0}^\Delta x^{2} dx = \Delta ^{2}/3$(正负各半,均值平方相同)。

比值= $(\Delta ^{2}/3)/(\Delta ^{2}/12) = 4 \to 10\cdot \log_{10}(4) \approx 6.02 dB$。截断白白损失约 1 bit 的有效精度。

题 6(挑战):0.1 的 FP32 舍入 #

0.1 的二进制是 $0.000110011001100110011001100..._2$(0011 循环)。推导它的 FP32 尾数舍入为什么得到"第 23 位进位",并说明存储值比 0.1 大还是小。

题 6 解答

规格化后尾数(含隐含位)为 $1.100110011001100110011001100..._2$,截到第 24 位(隐含位 + 23 位)。第 24 位之后是 1,且非零尾随("> half"),所以按 round-to-nearest 进位:尾数最后一位$0 \to 1$。进位后存储值略大于 0.1(0.100000001490116119384765625 > 0.1)。如果恰好是 half(后面全 0),half-even 规则会起作用;这里不是 half。


11. 延伸阅读 #

  1. MIT 6.5940 Lecture 5 开场部分(Class Central):数据类型总览
  2. David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic(浮点必读,网上免费):IEEE 754 的舍入、epsilon、误差分析
  3. IEEE 754-2019 标准概述(Wikipedia 词条即可):次正规数、NaN、round-half-even
  4. Mark Horowitz, “Computing’s Energy Problem (and what we can do about it)”, ISSCC 2014:数据搬运能量的数量级证据
  5. 下一篇: 02 量化问题的形式化与均匀量化理论——用本章的编码与误差工具,正式建立量化的数学框架。