Arytmetyka zmiennopozycyjna

Problem z operacjami arytmetycznymi realizowanymi przez komputery polega na tym, że „po cichu" zakładamy, że argumenty równe są swoim reprezentacjom zmiennoprzecinkowym, oraz, że podczas obliczeń, nie wystąpi ani nadmiar1 ani niedomiar2.

Niech a=rd(a)=2cama i b=rd(b)=2cbmb będą argumentami. Przyjmijmy, że ab>0. Ich (dokładna) suma wynosi:

a+b=2ca(maa+mb2(cacb))=2cams

Mantysa wyniku wyliczana jest przez dodanie do mantysy liczby a odpowiednio przekształconej (to znaczy tak, żeby cechy liczb a i b były jednakowe) mantysy liczby b.

Wszystko to wygląda jakoś tak:

Jakość wyniku zależy od możliwości poprawnego zaokrąglenia wyniku. A zatem od liczby bitów, na których zapisywany jest wynik. Gdy jest ich tylko t — nie jest dobrze. Historycznie, liczba dodatkowych bitów wewnętrznego rejestru arytmometru zmieniała się od zera aż do t (wynikowy rejestr podwójnej długości). Dopiero norma IEEE-754 [1] wprowadziła „obowiązek" korzystania z dodatkowego bitu.

Jeżeli symbolem fl oznaczać będziemy realizację działania w arytmetyce zmiennoprzecinkowej, to:

fl(a+b)=rd(a+b)

Ogólnie, dla dowolnej operacji

fl(ab)=rd(ab)=(ab)(1+ε),ε=ε(a,b,),|ε|2t

uzyskany (komputerowo) wynik, nieznacznie, różni się od wyniku „prawdziwego".

Wydaje się, że niewielkie (2t[1015,106]) względne błędy nie powinny mieć wielkiego wpływu na wyniki. Okazuje się, że jest inaczej, a sposób realizacji obliczeń może mieć ogromny wpływ na wyniki.

Rozpatrzmy dwa różne algorytmy wyliczania wartości różnicy kwadratów dwu liczb:

  • A1(a2b2)=a2b2

  • A2(a2b2)=(ab)(a+b)

fl(a2b2)=(a×a(1+ε1)b×b(1+ε2))(1+ε3)=(a2b2)(1+a2ε1b2ε2a2b2)(1+ε3)=(a2b2)(1+δ)

W przypadku gdy a2 jest bliskie b2, a ε1 i ε2 mają przeciwne znaki — błąd względny δ moze być dowolnie duży.

W przypadku drugiego algorytmu:

fl((ab)(a+b))=((ab)(1+ε1)(a+b)(1+ε2))(1+ε3)=(a2b2)(1+δ)

gdzie δ|ε1|+|ε2|+|ε3|, zatem δ jest zawsze mniejszy od 32t.

W szczególności, ze względu na algorytm dodawania, gdy a i b są takie, że |b|122t|a|, zachodzi zależność:

fl(a+b)a.

(Wspominałam o tym na zajęciach z Technologii Informacyjnych.)

Konsekwencje tego mogą być bardzo poważne w przypadku numerycznego aproksymowania ilorazem różnicowym, pochodnej funkcji w punkcie. Zamiast otrzymywania coraz to lepszego przybliżenia pochodnej (gdy różnica wartości pomiędzy dwiema wartościami zmiennej niezależnej) dostaniemy wartości nie mające nic wspólnego z pochodną.

Cytowania

  1. IEEE Standard for Floating-Point Arithmetic, IEEE, 2008. doi:10.1109/IEEESTD.2008.4610935

  1. Nadmiar to sytuacja taka, gdy wynik operacji jest większy niż może być zapamiętany w formie komputerowej (całkowitej lub zmiennoprzecinkowej). ↩︎

  2. Niedomiar występuje wtedy gdy wyniki jest mniejszy niż najmniejsza liczba jaką można w formie zmiennoprzecinkowej zapisać. ↩︎

Poprzedni
Następny