Systemy liczbowe: nadmiar i niedomiar

article-thumbnail

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 ze zjawiskiem nadmiaru i niedomiaru

  1. Przydzielenie większej ilości pamięci potrzebnej do wykonania danych obliczeń oraz blokada ilości cyfr po i przed przecinkiem.
  2. 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.

Żródło

http://home.agh.edu.pl/~horzyk