18-11-2017, 22:39
Systemy liczbowe
NADMIAR I NIEDOMIAR
Wstęp
Określenie największej możliwej liczby, jaka może istnieć jest niemożliwe, gdyż zbiór liczb jest nieskończony. Również określenie liczby najbliższej do konkretnej jest niemożliwe, gdyż możemy daną liczbę zapisać z nieskończoną ilością miejsc po przecinku.
Jednak urządzenia komputerowe posiadają skończoną pamięć, czyli skończone miejsce na zapis danych liczb w technice komputerowej. Dlatego też podczas obliczeń wykonywanych za pomocą komputera może wystąpić zjawisko tak zwanego Nadmiaru (overflow) oraz Niedomiaru (underflow), w którym liczby wychodzą za przestrzeń pamięci, skutkiem czego dane dotyczące liczby są tracone, a sama liczba jest wyświetlona niepoprawnie.
Zjawiska te zostały opisane w standardzie IEEE 754.
Nadmiar
Nadmiar to zjawisko występujące przy liczbach zajmujących więcej bitów pamięci, niż zostało im przydzielone. Przykładowo bajt (8 bitów) przeznaczony na liczbę dziesiętną naturalną pozwoli zapisać liczbę z zakresu od 0 do 255. W poniższym przykładzie pozwolę sobie dodać 1 binarnie do liczby 11111111B; Kolorem czerwonym został oznaczony nadmiar w dodawaniu binarnym oraz błędny wynik konwersji liczby zapisanej na bajcie.
Poniżej wycinek kodu symulujący działanie nadmiaru na zmiennej posiadającej 16 bitów pamięci. Napisany w programie Code::Blocks 16.01 w języku C++.
Niedomiar
Niedomiar to zjawisko występujące przy liczbach zajmujących mniej bitów pamięci, niż zostało im przydzielone, bądź w wypadku liczb ujemnych zapisanych w zmiennych bez znakowych. Przykładowo bajt (8 bitów) przeznaczony na liczbę dziesiętną naturalną pozwoli zapisać liczbę z zakresu od 0 do 255. W poniższym przykładzie pozwolę sobie odjąć 1 binarnie do liczby 00000000B; Kolorem czerwonym został oznaczony błędny wynik w obu działaniach.
Poniżej wycinek kodu symulujący działanie niedomiaru na zmiennej posiadającej 16 bitów pamięci. Napisany w programie Code::Blocks 16.01 w języku C++.
Sposoby radzenia sobie z zjawiskiem nadmiaru i niedomiaru.
- Przydzielenie większej ilości pamięci potrzebnej do wykonania danych obliczeń oraz blokada ilości cyfr po i przed przecinkiem.
- Wprowadzenie wartości NaN (Not a Number) dla przedstawienia nieskończoności.
Ciekawostki
Jednym z przykładów problemu nadmiaru może być problem roku 2038 występujący na systemach operacyjnych Unix oraz w programach korzystających z czasu uniksowego. Problem ten jest wynikiem ówczesnego zapisu czasu (w sekundach) na 32 bitowej zmiennej, które skutkowały niewystarczającą pamięcią na wyświetlenie daty późniejszej niż 19 stycznia 2038 - po przekroczeniu pewnej daty, zegar wraca do daty oddalonej od domyślnej 13 grudnia 1901 bądź do domyślnej 1 stycznia 1970.