在数值分析中,灾难性抵消(英語:catastrophic cancellation)[1][2]是指两个大小相近的数值的近似值相减,得到的差值可能和原始数值相减得到的真实的差值有很大差异,因而近似值的差值不能用作真实值差值的近似值。
例如,如果有两个螺柱,一个长,另一个长,用厘米刻度的尺子测量其长度,得到的近似值为和。在相对误差方面,它们是真实长度的良好的近似值:近似值的误差小于真实长度的2%,即 。
但是,如果用这些近似长度相减,则差值为,而长度之间的真实差值是。用近似值算出的差,和用真实值算出的差相比,偏离了100%。
即使差值计算本身是精确的,灾难性抵消仍然有可能发生,如上例所示——它不是哪种类型的运算(如浮点运算)的属性;当输入值本身是近似值时,进行减法运算就必有灾难性抵消。实际上,根据Sterbenz引理,浮点运算中,当输入值足够接近时,浮点差可以精确计算——浮点减法运算本身并未引入捨入誤差。
形式上,发生灾难性抵消是因为减法运算对邻近数值的输入是病态的:即使近似值和与真实值和 相比,相对误差和不大,近似值差的与真实值差相对误差也会与真实值差成反比:
因此,两个近似值的精确差值与真实数字差值的相对误差为:
如果真实输入和很接近,结果可能会非常大。
- ^ Muller, Jean-Michel; Brunie, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Torres, Serge. Handbook of Floating-Point Arithmetic 2nd. Gewerbestrasse 11, 6330 Cham, Switzerland: Birkhäuser. 2018: 102 [2022-06-10]. ISBN 978-3-319-76525-9. doi:10.1007/978-3-319-76526-6. (原始内容存档于2023-04-28).
- ^ Goldberg, David. What every computer scientist should know about floating-point arithmetic. ACM Computing Surveys (New York, NY, United States: Association for Computing Machinery). March 1991, 23 (1): 5–48 [2020-09-17]. ISSN 0360-0300. S2CID 222008826. doi:10.1145/103162.103163. (原始内容存档于2019-03-09).