Po stromych schodach

Błąd miesiąca.

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 , 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 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ń.

Chcesz być na bieżąco z CHIP? Obserwuj nas w Google News