Katastrofické zrušení - Catastrophic cancellation

V numerické analýze je katastrofické zrušení fenomén, který po odečtení dobrých aproximací dvou blízkých čísel může přinést velmi špatnou aproximaci rozdílu původních čísel.

Předpokládejme například, že máte dva dřevěné cvočky, jeden dlouhý a druhý dlouhý. Pokud je změříte pomocí pravítka, které je dobré pouze na centimetr, můžete získat aproximace a . V závislosti na vašich potřebách, mohou být dobré přiblížení, v relativní chyby , ke skutečné délky: aproximace jsou omylem o méně než 2% skutečných délek .

Pokud však odečtete přibližné délky, dostanete , i když skutečný rozdíl mezi délkami je . Rozdíl z aproximací, a již chybou 100% velikosti rozdílu skutečných hodnot .

Katastrofické zrušení může nastat, i když je rozdíl vypočítán přesně, jako v příkladu výše - nejde o vlastnost žádného konkrétního druhu aritmetiky, jako je aritmetika s plovoucí desetinnou čárkou ; spíše je vlastní odčítání, když vstupy jsou samotné aproximace. V aritmetice s plovoucí desetinnou čárkou, když jsou vstupy dostatečně blízko, je rozdíl s plovoucí desetinnou čárkou vypočítán přesně pomocí Sterbenzova lematu - při operaci odčítání s plovoucí desetinnou čárkou není zavedena žádná chyba zaokrouhlování.

Formální analýza

Formálně ke katastrofickému zrušení dochází, protože odčítání je na blízkých vstupech špatně podmíněno : i když jsou aproximace a mají malé relativní chyby a od skutečných hodnot a relativní chyba přibližného rozdílu od skutečného rozdílu je nepřímo úměrná skutečnému rozdílu:

Relativní chyba přesného rozdílu aproximací z rozdílu skutečných čísel tedy je

které mohou být libovolně velké, pokud jsou skutečné vstupy a jsou blízké.

V numerických algoritmech

Odečtení blízkých čísel aritmetikou s plovoucí desetinnou čárkou nemusí vždy způsobit katastrofické zrušení nebo dokonce jakoukoli chybu - u Sterbenzova lematu , pokud jsou čísla dostatečně blízko, je rozdíl s plovoucí desetinnou čárkou přesný. Ale zrušení může zesílit chyby ve vstupech, které vznikly zaokrouhlováním v jiné aritmetice s plovoucí desetinnou čárkou.

Příklad: Rozdíl čtverců

Vzhledem k daným číslům a naivní pokus o výpočet matematické funkce aritmetikou s plovoucí desetinnou čárkou podléhá katastrofickému zrušení, když jsou a jsou blízko velikosti, protože odčítání zesílí chyby zaokrouhlování ve čtvercích. Alternativní factoring , vyhodnocený aritmetikou s plovoucí desetinnou čárkou , se vyhne katastrofickému zrušení, protože se vyhne zavedení chyby zaokrouhlování vedoucí k odčítání.

Například, jestliže a , pak skutečná hodnota tohoto rozdílu je . V aritmetice IEEE 754 binary64 poskytuje vyhodnocení alternativního factoringu správný výsledek přesně (bez zaokrouhlování), ale vyhodnocení naivního výrazu dává nejbližší číslo s plovoucí desetinnou čárkou , z nichž je správná pouze polovina číslic a druhá polovina (podtrženo) jsou odpadky.

Příklad: Složitý arcsine

Při výpočtu komplexní funkce arcsine může být v pokušení použít logaritmický vzorec přímo:

Předpokládejme však, že pro . Pak a ; nazvat rozdíl mezi nimi - velmi malý rozdíl, téměř nulový. If se hodnotí v aritmetickém dávání s plovoucí desetinnou čárkou

s jakoukoli chybou , kde označuje zaokrouhlování s plovoucí desetinnou čárkou, pak výpočet rozdílu

dvou blízkých čísel, obě velmi blízko , může zesílit chybu v jednom vstupu o faktor - velmi velký faktor, protože byl téměř nulový. Například pokud , skutečná hodnota je přibližně , ale použití naivního logaritmického vzorce v aritmetice IEEE 754 binary64 může dát , pouze pět z šestnácti číslic je správné a zbytek (podtrženo) veškerý odpad.

V případě for se použití identity vyhne zrušení, protože ale , takže odčítání je fakticky přidání se stejným znaménkem, které se nezruší.

Příklad: převod Radix

Numerické konstanty v softwarových programech jsou často psány desítkově, například ve fragmentu C double x = 1.000000000000001;k deklaraci a inicializaci pojmenované proměnné IEEE 754 binary64 x. Není však číslo s plovoucí desetinnou čárkou binary64; nejbližší, na kterou bude inicializován tento fragment, je . Ačkoli převod radixu z desetinné plovoucí desetinné čárky na binární plovoucí desetinnou čárku způsobí pouze malou relativní chybu, může ji katastrofické zrušení zesílit na mnohem větší: x

double x = 1.000000000000001;  // rounded to 1 + 5*2^{-52}
double y = 1.000000000000002;  // rounded to 1 + 9*2^{-52}
double z = y - x;              // difference is exactly 4*2^{-52}

Rozdíl je . Relativní chyby od a od jsou oba níže a odčítání s plovoucí desetinnou čárkou se počítá přesně podle Sterbenzova lematu. xyy - x

Ale i když jsou vstupy dobré aproximace a přestože je odčítání vypočítáno přesně, rozdíl aproximací má relativní chybu přes od rozdílu původních hodnot, jak je napsáno v desítkové soustavě: katastrofické zrušení zesílilo malou chybu v převodu radixu do velké chyby ve výstupu.

Benigní zrušení

V numerických algoritmech je zrušení někdy užitečné a žádoucí. Například algoritmy 2Sum a Fast2Sum se spoléhají na takové zrušení po chybě zaokrouhlování, aby přesně vypočítali, jaká byla chyba v operaci s plovoucí desetinnou čárkou jako samotné číslo s plovoucí desetinnou čárkou.

Pokud bude funkce naivně hodnocena v bodech , ztratí zaokrouhlování většinu číslic . Samotná funkce je však při vstupech blízko dobře stabilizována . Přepis to jako

využívá zrušení, aby se zabránilo chybě přímo vyhodnotit. To funguje, protože zrušení v čitateli a zrušení ve jmenovateli působí proti sobě; funkce je dostatečně dobře podmíněna blízko nuly, která poskytuje dobrou aproximaci , a tedy dává dobrou aproximaci .

Reference