Po stromych schodach

Czasami zaokrąglenia liczb dokonywane przez procesor mogą spowodować błędy obliczeniowe. Zobaczmy, jak potrafi pomylić się koprocesor Celerona.

Kłopoty zaczynają się wówczas, gdy uruchomimy na komputerze program dzielący dowolną liczbę przez zero albo spróbujemy używać bardzo małych liczb podczas wykonywania operacji matematycznych.

Kiedy korzystamy z koprocesorów Celerona, musimy niestety liczyć się z tym, że liczby rzeczywiste zostaną niedokładnie zinterpretowane. Aby się przekonać, jak bardzo potrafi się mylić jednostka zmiennoprzecinkowa procesora Celeron, wystarczy napisać w Delphi program, którego zadaniem będzie wyświetlanie wykresów funkcji. Fragment kodu źródłowego takiej aplikacji zamieszczamy na dołączonej do magazynu płycie CD-ROM, a sam program można pobrać ze strony internetowej http://www.wingraph.phg.pl/.

Załóżmy, że program wyświetla wykres funkcji f(x)=x w przedziale o długości 300 pikseli. Okazuje się, że dla bardzo małych wartości zmiennej x wcale nie otrzymamy znanego wszystkim liniowego wykresu. Zmienna x powinna przyjmować trzysta wartości, jednak okazuje się, że w rzeczywistości jest ich pięć:

0.212491901394972
0.212491901394973
0.212491901394974
0.212491901394975
0.212491901394976

Wykres wygląda nieco lepiej dla zmiennej x w przedziale <-1E-4929; 1E4929>, a jest to przecież przedział o wiele mniejszy.

Widać zatem, że podczas obliczeń „gubione” zostają cyfry począwszy od 15. miejsca po przecinku. W efekcie zamiast eleganckiej linii prostej na ekranie pojawia się pięć schodków. A gdzie tkwi przyczyna pojawiania się takiego błędu? I skąd biorą się różnice w wykresach dla różnych przedziałów liczb?

Otóż koprocesor przechowuje liczby w postaci cechy i mantysy. Ich reprezentacja bitowa jest skończona – zajmuje 10 bajtów (osiem bajtów przeznaczono na mantysę i dwa na cechę). Program, wykonując obliczenia, musi „obciąć” liczbę cyfr do tylu miejsc po przecinku, aby zmieścić ją w 10 bajtach. A operacja taka odbywa się właśnie kosztem mantysy. Przedział liczb <-1E-4929; 1E4929> jest wprawdzie mały, ale jednocześnie reprezentacja samych liczb jest stosunkowo krótka. W efekcie operacje na mantysie wykonywane są z większą dokładnością.

A co z tego wszystkiego wynika? W dobie olbrzymich maszyn liczących należy zadać sobie pytanie, czy przypadkiem nie należałoby napisać nowych kompilatorów w oparciu o takie reprezentacje liczb, których długość byłaby wielokrotnie większa od dzisiejszej dziesięciobajtowej. Drugim sposobem jest budowa bardziej rozbudowanych koprocesorów, wykorzystujących większą ilość pamięci w celu dokładniejszego składowania danych. Niestety, w chwili obecnej nie można wykorzystywać domowych komputerów do naprawdę dokładnych obliczeń.

0
Zamknij

Choć staramy się je ograniczać, wykorzystujemy mechanizmy takie jak ciasteczka, które pozwalają naszym partnerom na śledzenie Twojego zachowania w sieci. Dowiedz się więcej.