在數值分析中,災難性抵消(英語:catastrophic cancellation)[1][2]是指兩個大小相近的數值的近似值相減,得到的差值可能和原始數值相減得到的真實的差值有很大差異,因而近似值的差值不能用作真實值差值的近似值。
例如,如果有兩個螺柱,一個長
,另一個長
,用厘米刻度的尺子測量其長度,得到的近似值為
和
。在相對誤差方面,它們是真實長度的良好的近似值:近似值的誤差小於真實長度的2%,即
。
但是,如果用這些近似長度相減,則差值為
,而長度之間的真實差值是
。用近似值算出的差
,和用真實值算出的差
相比,偏離了100%。
即使差值計算本身是精確的,災難性抵消仍然有可能發生,如上例所示——它不是哪種類型的運算(如浮點運算)的屬性;當輸入值本身是近似值時,進行減法運算就必有災難性抵消。實際上,根據Sterbenz引理,浮點運算中,當輸入值足夠接近時,浮點差可以精確計算——浮點減法運算本身並未引入捨入誤差。
形式上,發生災難性抵消是因為減法運算對鄰近數值的輸入是病態的:即使近似值
和
與真實值
和
相比,相對誤差
和
不大,近似值差
的與真實值差相對誤差也會與真實值差
成反比:
![{\displaystyle {\begin{aligned}{\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{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3fa4902d464d69b3a0285cf393ef0594db5e401a)
因此,兩個近似值的精確差值
與真實數字差值
的相對誤差為:
![{\displaystyle \left|{\frac {x\delta _{x}-y\delta _{y}}{x-y}}\right|}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9f58ada47dc2da461c87eb3b50b20dc0ffa1ac37)
如果真實輸入
和
很接近,結果可能會非常大。
- ^ 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).