跳到正文
格致开物MATHWIKI

数值稳定性

数值稳定性讨论计算过程怎样处理小的舍入与数据扰动。问题的条件说明精确答案对输入有多敏感;算法的稳定性说明它额外放大了多少误差。即便同一个数学公式完全正确,两种代数等价的实现也可能给出不同的浮点结果。

一元二次方程的小根

考虑 x2−108x+1=0。精确的小根是 (108−1016−4)/2,约为 10−8。直接按此式计算要从两个约 108 的近似数中相减以取出约 10−8 的差;前面的舍入会严重吞掉有用数字。由两根乘积等于 c/a=1,先用加法求大根 xlarge=108+1016−42,xsmall=1xlarge. 第二式避免了两个接近的大数相减。把两根代入原多项式并检查残差,可以验证改写后的结果;仅看屏幕上显示了多少位小数不够。若系数尺度很不均衡,仍要检查判别式计算是否溢出或下溢。

后向稳定与问题病态

一种有用的稳定性标准是:算法返回值等于邻近输入的精确答案,邻近程度与机器精度同阶。这叫后向稳定。若问题的条件数很大,小的输入变化本来就会造成大的输出变化,此时即使算法后向稳定,前向误差也可能大。反过来,条件良好的问题若用上面会消去有效数字的公式求小根,就把可避免的算法误差叠加到问题误差上。误差链可写为“输入扰动 → 精确问题的响应 → 算法额外扰动”,具体大小依赖所用范数、数据尺度和中间步骤。

连续求和也是例子:在 binary64 中 (1016+1)−1016 可得 0,而 (1016−1016)+1 得 1。改变顺序有时有帮助,但不是“总从小到大加”对任何带符号数据都必然最优的规则。应结合前向误差与后向误差、实测残差和误差界判断。

参考资料与相关词条