YaChudo

Нищівне скасування

Переглядів: 0. Оновлено 10.10.2026.

У чисельних методах, нищівне скасування[1][2] — це явище коли віднімання двох хороших наближень двох близьких чисел може породити дуже погане наближення різниці двох початкових чисел.

Наприклад, якщо маємо дві дошки, одна L 1 = 254.5 см {\displaystyle L_{1}=254.5\,{\text{см}}} завдовшки, а інша L 2 = 253.5 см {\displaystyle L_{2}=253.5\,{\text{см}}} завдовжки, і ми виміряємо їх лінійкою, точність якої лише сантиметр, тоді наближення будуть L ~ 1 = 255 см {\displaystyle {\tilde {L}}_{1}=255\,{\text{см}}} і L ~ 2 = 253 см {\displaystyle {\tilde {L}}_{2}=253\,{\text{см}}} . Ці наближення можуть бути хорошими у сенсі відносної похибки, до справжніх довжин: наближення відхились менш ніж на 2 % від справжніх довжин, | L 1 − L ~ 1 | / | L 1 | < 2 % {\displaystyle |L_{1}-{\tilde {L}}_{1}|/|L_{1}|<2\%} .

Однак, якщо наближені довжини відняти, то різниця буде L ~ 1 − L ~ 2 = 255 см − 253 см = 2 см {\displaystyle {\tilde {L}}_{1}-{\tilde {L}}_{2}=255\,{\text{см}}-253\,{\text{см}}=2\,{\text{см}}} , хоча справжня різниця між довжинами становить L 1 − L 2 = 254.5 см − 253.5 см = 1 см {\displaystyle L_{1}-L_{2}=254.5\,{\text{см}}-253.5\,{\text{см}}=1\,{\text{см}}} . Різниця між наближенням, 2 см {\displaystyle 2\,{\text{см}}} , має похибку в 100% від розміру різниці справжніх значень, 1 см {\displaystyle 1\,{\text{см}}} .

Нищівне скасування може статись навіть якщо різниця обчислена точно, як у прикладі вище — це не властивість якогось певного різновиду арифметики як-от з рухомою комою; радше це притаманне відніманню, коли входи це наближення. Насправді, в арифметиці з рухомою комою, коли входи достатньо близькі, вислід обчислення різниці точний, згідно з лемою Стербенца немає похибки заокруглення через дію віднімання з рухомою точкою.

Формальний розгляд

Формально, нищівне знищення відбувається, бо віднімання погано обумовлене на близьких входах: навіть, якщо наближення x ~ = x ( 1 + δ x ) {\displaystyle {\tilde {x}}=x(1+\delta _{x})} і y ~ = y ( 1 + δ y ) {\displaystyle {\tilde {y}}=y(1+\delta _{y})} мають малі відносні похибки | δ x | = | x − x ~ | / | x | {\displaystyle |\delta _{x}|=|x-{\tilde {x}}|/|x|} і | δ y | = | y − y ~ | / | y | {\displaystyle |\delta _{y}|=|y-{\tilde {y}}|/|y|} щодо справжніх значень x {\displaystyle x} і y {\displaystyle y} , відповідно, відносна похибка наближеної різниці x ~ − y ~ {\displaystyle {\tilde {x}}-{\tilde {y}}} від справжньої різниці x − y {\displaystyle x-y} зворотно пропорційна справжній різниці:

x ~ − y ~ = x ( 1 + δ x ) − y ( 1 + δ y ) = x − y + x δ x − y δ y = x − y + ( x − y ) x δ x − y δ y x − y = ( x − y ) ( 1 + x δ x − y δ y x − y ) . {\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}}}

Отже, відносна похибка точної різниці наближень x ~ − y ~ {\displaystyle {\tilde {x}}-{\tilde {y}}} щодо різниці справжніх чисел x − y {\displaystyle x-y} це

| x δ x − y δ y x − y | . {\displaystyle \left|{\frac {x\delta _{x}-y\delta _{y}}{x-y}}\right|.}

І вона може бути наскільки завгодно великою якщо справжні числа x {\displaystyle x} і y {\displaystyle y} близькі.

У числових алгоритмах

Приклад: Різниця квадратів

Маючи числа x {\displaystyle x} і y {\displaystyle y} , наївна спроба обчислити математичну функцію x 2 − y 2 {\displaystyle x^{2}-y^{2}} з використанням арифметики з рухомою точкою fl ⁡ ( fl ⁡ ( x 2 ) − fl ⁡ ( y 2 ) ) {\displaystyle \operatorname {fl} (\operatorname {fl} (x^{2})-\operatorname {fl} (y^{2}))} призведе до нищівного скасування, якщо x {\displaystyle x} і y {\displaystyle y} близькі величини, бо віднімання може виявити похибки заокруглення під час піднесення до квадрату. Альтернативне представлення ( x + y ) ( x − y ) {\displaystyle (x+y)(x-y)} , обчислене в арифметиці з рухомою точкою таким чином fl ⁡ ( fl ⁡ ( x + y ) ⋅ fl ⁡ ( x − y ) ) {\displaystyle \operatorname {fl} (\operatorname {fl} (x+y)\cdot \operatorname {fl} (x-y))} , уникає нищівного скасування, бо уникає похибки заокруглення.[2]

Наприклад, якщо x = 1 + 2 − 29 ≈ 1.0000000018626451 {\displaystyle x=1+2^{-29}\approx 1.0000000018626451} і y = 1 + 2 − 30 ≈ 1.0000000009313226 {\displaystyle y=1+2^{-30}\approx 1.0000000009313226} , тоді справжнє значення різниці x 2 − y 2 {\displaystyle x^{2}-y^{2}} це 2 − 29 ⋅ ( 1 + 2 − 30 + 2 − 31 ) ≈ 1.8626451518330422 × 10 − 9 {\displaystyle 2^{-29}\cdot (1+2^{-30}+2^{-31})\approx 1.8626451518330422\times 10^{-9}} . В арифметиці IEEE 754 binary64, обчислення ( x + y ) ( x − y ) {\displaystyle (x+y)(x-y)} дає правильний результат (без округлення), тоді як обчислення наївного виразу x 2 − y 2 {\displaystyle x^{2}-y^{2}} повертає таке число з рухомою точкою 2 − 29 = 1.8626451 4923095703125 _ × 10 − 9 {\displaystyle 2^{-29}=1.8626451{\underline {4923095703125}}\times 10^{-9}} , де правильні менш ніж половина цифр, а інші (підкреслені) цифри відображають загублені доданки 2 − 59 + 2 − 60 {\displaystyle 2^{-59}+2^{-60}} , втрачені через заокруглення під час обчислення проміжних квадратних значень.

Примітки

  1. ↑ Muller, Jean-Michel; Brunie, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Torres, Serge (2018). Handbook of Floating-Point Arithmetic (вид. 2nd). Gewerbestrasse 11, 6330 Cham, Switzerland: Birkhäuser. с. 102. doi:10.1007/978-3-319-76526-6. ISBN 978-3-319-76525-9.{{cite book}}: Обслуговування CS1: Сторінки з неправильним використанням параметра location (посилання)
  2. ↑ а б Goldberg, David (Березень 1991). What every computer scientist should know about floating-point arithmetic. ACM Computing Surveys. New York, NY, United States: Association for Computing Machinery. 23 (1): 5—48. doi:10.1145/103162.103163. ISSN 0360-0300. S2CID 222008826. Процитовано 17 вересня 2020.

Джерело: стаття у Вікіпедії та історія редагувань (автори).