Utrata cyfr znaczących

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

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 rd(z)=±mt2c, gdzie mt jest mantysą – liczbą długości t taką, że m(0,12, a c jest cechą – dowolną liczbą całkowitą

rd(x)=±0.1c1cticti+1ctrd(y)=±0.1d1dtidti+1dtrd(x)rd(y)=±0.0001ctdt

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

rd(xy)=±mt2c,

gdzie m(0,12.

Aby otrzymać mantysę spełniającą ten warunek, należy „obciąć” początkowe zera w liczbie xy (poprzez pomożenie przez 2ti) – wtedy jednak ostatnie niezerowe cyfry na pozycjach xy 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 |xy| 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:

f(x)=x+93.

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:

f(x)=(x+93)x+9+3x+9+3=x+99x+9+3=xx+9+3.

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

x1=bb24ac2a,
x2=b+b24ac2a.

W sposobie obliczenia jednego z pierwiastków jest odejmowanie. Możliwa jest sytuacja, w której wartość b i b24ac 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.