在数值分析中,灾难性抵消()是指两个大小相近的数值的近似值相减,得到的差值可能和原始数值相减得到的真实的差值有很大差异,因而近似值的差值不能用作真实值差值的近似值。
例如,如果有两个螺柱,一个长L_1 = 254.5\,\text{cm},另一个长L_2 = 253.5\,\text{cm},用厘米刻度的尺子测量其长度,得到的近似值为\tilde L_1 = 255\,\text{cm}和\tilde L_2 = 253\,\text{cm}。在相对误差方面,它们是真实长度的良好的近似值:近似值的误差小于真实长度的2%,即|L_1 - \tilde L_1|/|L_1| 。
但是,如果用这些近似长度相减,则差值为\tilde L_1 - \tilde L_2 = 255\,\text{cm} - 253\,\text{cm} = 2\,\text{cm},而长度之间的真实差值是L_1 - L_2 = 254.5\,\text{cm} - 253.5\,\text{cm} = 1\,\text{cm}。用近似值算出的差2\,\text{cm},和用真实值算出的差1\,\text{cm}相比,偏离了100%。
即使差值计算本身是精确的,灾难性抵消仍然有可能发生,如上例所示——它不是哪种类型的运算(如浮点运算)的属性;当输入值本身是近似值时,进行减法运算就必有灾难性抵消。实际上,根据,浮点运算中,当输入值足够接近时,浮点差可以精确计算——浮点减法运算本身并未引入捨入誤差。
形式分析
形式上,发生灾难性抵消是因为减法运算对邻近数值的输入是病态的:即使近似值\tilde x = x (1 + \delta_x)和\tilde y = y (1 + \delta_y)与真实值x和y 相比,相对误差|\delta_x| = |x - \tilde x|/|x|和|\delta_y| = |y - \tilde y|/|y|不大,近似值差\tilde x - \tilde y的与真实值差相对误差也会与真实值差x - y成反比:
:
\begin{align}
\tilde x - \tilde y
&= x (1 + \delta_x) - y (1 + \delta_y)
= x - y + x \delta_x - y \delta_y \\
&= x - y + (x - y) \frac{x \delta_x - y \delta_y}{x - y} \\
&= (x - y) \biggr(1 + \frac{x \delta_x - y \delta_y}{x - y}\biggr)
\end{align}
因此,两个近似值的精确差值\tilde x - \tilde y与真实数字差值x - y的相对误差为:
: \left|\frac{x \delta_x - y \delta_y}{x - y}\right|
如果真实输入x和y很接近,结果可能会非常大。
参考文献
评论 (0)