Forum portalu Informatyk.edu.pl
Systemy liczbowe: nadmiar i niedomiar. - Wersja do druku

+- Forum portalu Informatyk.edu.pl (http://forum.informatyk.edu.pl)
+-- Dział: E.12, EE.08 (http://forum.informatyk.edu.pl/forumdisplay.php?fid=1)
+--- Dział: Urządzenia techniki komputerowej (http://forum.informatyk.edu.pl/forumdisplay.php?fid=6)
+--- Wątek: Systemy liczbowe: nadmiar i niedomiar. (/showthread.php?tid=69)



Systemy liczbowe: nadmiar i niedomiar. - Majstersztyk - 18-11-2017

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.

[Obrazek: image001-1.png]

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++.

[Obrazek: image003-2.png]
[Obrazek: image005-1.png]

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.

[Obrazek: image007-1.png]

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++.

[Obrazek: image009-1.png]
[Obrazek: image011-1.png]

Sposoby radzenia sobie z 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.