Skip to content

01 浮点数、舍入误差与条件数

1. 实数在机器中只有有限表示

规格化浮点数可抽象为

x=(1)smβe,

其中 β 是基数,m 只有有限位有效数字。IEEE 754 双精度以二进制表示,尾数有效精度为 53 位。舍入到最近值时,单位舍入误差约为

u=253.

不要把 u 与“最小正浮点数”混淆:前者描述相对精度,后者描述可表示范围。

IEEE 754 将一个浮点数拆成符号、指数和尾数。以二进制规格化数为例,隐藏的首位恒为 1

x=(1)s(1.f)22ebias.

单精度有 24 位有效二进制数字,u=224;双精度有 53 位,u=253。指数全零时表示次正规数,它用逐渐下溢填补 0 与最小规格化数之间的空隙;指数全一则用于 ± 和 NaN。

相邻浮点数的间距随指数成倍变化。因此“保留多少位小数”不是固定概念;更合适的尺度是 ulp(末位单位)和相对误差。

2. 标准舍入模型

若没有溢出或下溢,单次基本运算常写成

fl(xy)=(xy)(1+δ),|δ|u,

其中 {+,,×,/}。连续 n 次小误差的乘积可以压缩为

i=1n(1+δi)=1+θn,|θn|γn:=nu1nu,

前提是 nu<1

3. 内积与矩阵-向量乘法

顺序计算内积时,

fl(xTy)=(x+Δx)Ty=xT(y+Δy),

并可按分量控制 |Δx|γn|x|。因此

fl(Ax)=(A+E)x,|E|γn|A|.

这是一条典型后向误差解释:机器算出的结果,是一个邻近输入问题的精确结果。

4. 前向误差、后向误差与条件数

  • 前向误差:输出 y^ 与真实输出 y 相差多少。
  • 后向误差:要把输入改动多少,才能使 y^ 成为精确答案。
  • 条件数:问题本身将输入扰动放大多少。

对可逆线性系统 Ax=b,一阶相对扰动关系近似为

Δxxκ(A)(ΔAA+Δbb),

其中 κ(A)=AA1。稳定算法只能保证没有额外放大太多;它无法治愈病态问题。

5. 灾难性消去

两个接近的数相减,会保留绝对误差却损失大量有效数字。例如

secxcosx

x0 时直接计算会相消。等价改写

secxcosx=1cos2xcosx=sin2xcosx

通常更稳定。数值计算中,“数学等价”不等于“浮点行为等价”。

6. 残差不等于误差

若近似解 x^ 的残差为 r=bAx^,则

xx^=A1r.

因此 r 很小只有在 A1 不太大时才意味着解误差小。报告迭代结果时,最好同时给相对残差与条件数估计。

7. 稳定计算中的代数改写

另外三个常见改写是

x2+1x=1x2+1+x,x1,1cosx=2sin2(x/2),x0,

以及在 x0 时用专门的 expm1(x) 计算 ex1。相消本身不是错误:若输入是精确数,相减仍满足浮点模型;危险在于输入已经带有误差,而相减后的真值很小,使原有绝对误差对应巨大的相对误差。

8. 可计算的后向误差

线性系统更实用的无量纲后向误差是

η(x^)=bAx^Ax^+b.

它回答“相对扰动多大的 A,b 才能让 x^ 成为精确解”。当 κ(A)η1 时,可得到近似前向误差界

xx^xκ(A)η(x^).

9. 绝对条件数与相对条件数

对标量函数 f,一阶展开给出

f(x+Δx)f(x)f(x)Δx.

因此绝对条件数与相对条件数分别是

κabs(x)=|f(x)|,κrel(x)=|xf(x)f(x)|.

例如 f(x)=x 的相对条件数恒为 1/2;而 f(x)=1/(1x)x1 时变得病态。条件数属于问题,和使用哪种算法无关。

10. 分量误差与范数误差

范数界便于推导,但可能掩盖不同分量的尺度差异。矩阵乘法的分量误差界

|fl(Ax)Ax|γn|A||x|

比单纯写 ΔyγnAx 更细。数据跨越多个数量级时,应优先考虑分量相对误差、缩放和等价平衡。

11. 误差分析的三步闭环

  1. 向后分析算法:证明计算结果精确对应于某个邻近输入。
  2. 扰动分析问题:估计邻近输入会让精确解变化多少。
  3. 合成前向界:通常得到“前向误差 条件数 × 后向误差”。

这一区分非常重要:病态但向后稳定,说明算法已经尽责;良态却误差很大,则应怀疑算法或实现。

12. 一个可复现实验:Hilbert 矩阵

Hilbert 矩阵 Hn=(1/(i+j1)) 对称正定,却迅速变得病态。令真解为全一向量,先构造 b=Hn1,再用浮点求解。随着 n 增大,残差可能仍接近机器精度,而解的有效数字明显减少。这同时展示了:

  • 小残差可以和大前向误差共存;
  • 稳定分解不能抵消 κ(Hn)
  • 用已知真解的构造实验可以把算法误差与数据误差分开。

13. 自检

  • [ ] 能解释单位舍入误差与最小正数的区别。
  • [ ] 能使用 1+θnγn 记号合并多次误差。
  • [ ] 能区分问题病态与算法不稳定。
  • [ ] 会通过代数改写避免灾难性消去。
  • [ ] 会用相对后向误差和条件数解释小残差。

下一章:三角求解与 LU 分解