Utrata cyfr znaczących

Utrata cyfr znaczących – zjawisko pojawiające się w obliczeniach komputerowych, konsekwencja zapisu liczb rzeczywistych w komputerze. Występuje ona np. podczas odejmowania liczb, których różnica jest znacznie mniejsza niż każda z tych liczb. W efekcie liczba cyfr znaczących wyniku maleje do nieakceptowalnie niskiego poziomu. Sposoby ograniczania bądź unikania takich efektów bada analiza numeryczna.

Wytłumaczenie zjawiskaEdytuj

Niech x i y będą bliskimi liczbami, których różnica jest znacznie mniejsza od każdej z nich. Niech rd(x) i rd(y) oznacza reprezentację liczb odpowiednio x i y w pamięci komputera. Liczby x oraz y dane są w postaci   gdzie   jest mantysą – liczbą długości t taką, że   a c jest cechą – dowolną liczbą całkowitą

 

W wyniku odejmowania bliskich liczb powstaje liczba zawierająca na pierwszych t-i pozycjach zera, na pozostałych pozycjach co najmniej jedną jedynkę. Liczba będąca wynikiem odejmowania musi być znormalizowana, tj. przedstawiona w postaci:

 

gdzie  

Aby otrzymać mantysę spełniającą ten warunek, należy „obciąć” początkowe zera w liczbie x-y (poprzez pomożenie przez  ) – wtedy jednak ostatnie niezerowe cyfry na pozycjach x-y zostaną przesunięte na pierwsze pozycje, i jeżeli i<t nie będzie wiadomo czym zapełnić pozostałe miejsca w mantysie (właściwe zostały wcześniej odrzucone, przez zaokrąglenie x i y). Przyjęcie, że te utracone pozycje zostaną zapełnione np. zerami, jest tak samo dobre jak założenie, że zostaną one zapełnione losowymi liczbami – w obu wypadkach będą to bezwartościowe dane, niemające wiele wspólnego z rzeczywistym, lub choćby do niego zbliżonym wynikiem.

Gdy różnica |x-y| dąży do zera, błąd względny z rośnie nieograniczenie.

PrzykładyEdytuj

Przykład 1Edytuj

Za przykład zadania źle uwarunkowanego, tj. takiego, w przypadku którego może dojść do utraty cyfr znaczących w trakcie obliczeń komputerowych, może posłużyć prosta funkcja:

 

Dla x w pobliżu zera wartość pod pierwiastkiem jest bardzo bliska 3 i w przypadku obliczeń dokonywanych przy pomocy komputera występuje utrata cyfr znaczących.

RozwiązanieEdytuj

Prostym sposobem na poradzenie sobie z tym problemem jest przekształcenie wzoru naszej funkcji:

 

Jest to wzór algebraicznie równoważny, a nie zawierający operacji odejmowania – teraz nawet dla x bliskich 0 w przypadku obliczeń komputerowych nie wystąpi zjawisko utraty cyfr znaczących.

Przykład 2Edytuj

Innym przykładem na to, że nawet najprostsze algorytmy mogą być źle uwarunkowane jest „szkolny” algorytm obliczania pierwiastków równania kwadratowego

 
 

W sposobie obliczenia jednego z pierwiastków jest odejmowanie. Możliwa jest sytuacja, w której wartość   i   mogą być dość bliskie zeru co do modułu – nastąpi utrata cyfr znaczących.

RozwiązanieEdytuj

Sposobem na ominięcie tego problemu mogą być Wzory Viète’a – dobrze uwarunkowany pierwiastek może być obliczony „wprost”, drugi otrzymany ze wzoru Viète’a. Należy również zauważyć, że możemy mieć tutaj do czynienia z dwoma przypadkami, tj. b>=0 oraz b<0. Dla pierwszego przypadku dobrze uwarunkowanym będzie pierwiastek pierwszy, a dla drugiego przypadku dobrze uwarunkowanym będzie pierwiastek drugi.