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 zjawiska
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łady
Przykład 1
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ązanie
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 2
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ązanie
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.