跳到正文
格致开物MATHWIKI

浮点数与舍入误差

计算机浮点数用有限位有效数字和指数近似实数,类似科学记数法 ±m×2e。许多十进制小数没有有限二进制展开,例如 0.1,存储时只能取附近的可表示数。舍入误差是精确结果与存储或运算后数值的差;它与用有限差分近似导数时的截断误差是两回事。

一次“消失”的加法

在常见的 IEEE 754 binary64、默认就近舍入设置下,1016+1 超出该量级相邻浮点数的分辨能力,运算结果会舍入成 1016。于是按左到右算 (1016+1)−1016 得到 0,而精确实数结果为 1。改算 (1016−1016)+1 则得到 1。这不是代数结合律失效,而是每一步都要舍入,浮点运算不必满足实数加法的结合律。

相对误差模型的范围

对正常范围内、没有溢出或下溢且结果可按通常方式舍入的基本运算,常写 fl⁡(a∘b)=(a∘b)(1+δ),|δ|≤u. 这里 u 是单位舍入误差;binary64 就近舍入时通常取 u=2−53≈1.11×10−16。它是分析模型,不保证最终计算始终有十六位正确数字:多次操作误差会传播,接近零的相减可能把输入中的相对误差显露出来。binary64 中常见的机器 epsilon 2−52 是 1 与下一个大于 1 的可表示数间距,和 u 的定义相差一倍。次正规数、除零、无穷、NaN 和溢出须另行处理,不能直接把上式当成所有情况的定理。

计算前先保留单位与尺度;比较两个近似结果时,不应把“显示成一样”当作数学相等。小差值尤其需检查前向误差与后向误差和条件数。例如在求方程根时,先把问题本身的敏感性与算法舍入区分开,才能选择真正有用的改写方式。

参考资料与相关词条