灾难性抵消

来自testwiki
跳转到导航 跳转到搜索

Template:Refimprove数值分析中,灾难性抵消Template:Lang-en[1][2]是指两个大小相近的数值的近似值相减,得到的差值可能和原始数值相减得到的真实的差值有很大差异,因而近似值的差值不能用作真实值差值的近似值。

例如,如果有两个螺柱,一个长L1=254.5cm,另一个长L2=253.5cm,用厘米刻度的尺子测量其长度,得到的近似值为L~1=255cmL~2=253cm。在相对误差方面,它们是真实长度的良好的近似值:近似值的误差小于真实长度的2%,即|L1L~1|/|L1|<2%

但是,如果用这些近似长度相减,则差值为L~1L~2=255cm253cm=2cm,而长度之间的真实差值是L1L2=254.5cm253.5cm=1cm。用近似值算出的差2cm,和用真实值算出的差1cm相比,偏离了100%。

即使差值计算本身是精确的,灾难性抵消仍然有可能发生,如上例所示——它不是哪种类型的运算(如浮点运算)的属性;当输入值本身是近似值时,进行减法运算就必有灾难性抵消。实际上,根据Template:Link-en,浮点运算中,当输入值足够接近时,浮点差可以精确计算——浮点减法运算本身并未引入捨入誤差

形式分析

形式上,发生灾难性抵消是因为减法运算对邻近数值的输入是病态的:即使近似值x~=x(1+δx)y~=y(1+δy)与真实值xy 相比,相对误差|δx|=|xx~|/|x||δy|=|yy~|/|y|不大,近似值差x~y~的与真实值差相对误差也会与真实值差xy成反比:

x~y~=x(1+δx)y(1+δy)=xy+xδxyδy=xy+(xy)xδxyδyxy=(xy)(1+xδxyδyxy)

因此,两个近似值的精确差值x~y~与真实数字差值xy的相对误差为:

|xδxyδyxy|

如果真实输入xy很接近,结果可能会非常大。

参考文献

Template:Reflist