数值线性代数
浮点运算
在纸上,一个实数可以有无穷多位数字。计算机无法存储这些,所以它只保留固定位数的有效数字加上一个指数——就像二进制下的科学记数法。其结果就是浮点数:每个数都被舍入到最近的可表示值,相邻可表示数之间存在间隙。这正是为什么计算出来的线性代数永远与精确的线性代数不完全相同。
关键常数是机器精度,常记作 eps 或 u,即 1 与下一个可表示数之间的间隙(对 IEEE 双精度,eps 约为 2.2e-16,相当于约 16 位十进制有效数字)。每个基本运算都满足 fl(a op b) = (a op b)(1 + delta),其中 |delta| <= u:单个加法、乘法或除法都几乎达到满精度的相对准确度,但这些微小误差会在整个算法中累积。
有两个后果影响着一切。其一,浮点加法不满足结合律——(a + b) + c 可能不等于 a + (b + c)——所以运算次序很重要。其二,两个几乎相等的数相减会引发灾难性抵消:前导数字相同并相互抵消,把原先隐藏的舍入噪声暴露成答案的前导数字。
实用的教训是要谦逊。计算出的答案 x-hat 并非精确答案 x;二者之差取决于你做了多少次运算、它们如何排列,以及问题本身有多敏感(即其条件数)。好的数值算法都经过设计,使这种不可避免的舍入造成的损害尽可能小。
fl(a op b) = (a op b)(1 + delta), |delta| <= u, u ~ 1.1e-16 (double)
浮点运算的标准模型:每次运算都精确到一个微小的相对扰动以内,该扰动以单位舍入误差 u 为界。
机器精度关乎的是表示方式,而非误差最终有多大。即便每一步都精确到 eps 以内,单个算法仍可能损失许多位数字——这些损失来自抵消和病态问题,而非某一次舍入。
又称
另见