niedziela, 2 marca 2014

Reprezentacja danych liczbowych w komputerze.

Reprezentacja binarna liczb ujemnych

Liczba ujemna w systemie dziesiętnym jest poprzedzona znakiem minus. W komputerze, każda informacja musi mieć postać ciągu zer i jedynek, dlatego znak liczby jest reprezentowany przez dodatkową cyfrę dwójkową, zwaną bitem znaku, która poprzedza właściwe cyfry liczby. Cyfra 1 na pozycji bitu znaku zastępuje tradycyjny znak minus w zapisie liczb ujemnych, a 0 występuje zawsze przed liczbami nieujemnymi. Bitu znaku liczby w reprezentacji binarnej nie można pominąć.
Zgodnie z tą umową, jeśli liczba jest reprezentowana na siedmiu bitach, włącznie z bitem znaku, to mamy (bit znaku został pogrubiony):
  • 25 = 0011001
  • -25 = 1011001
W reprezentacji dziesiętnej suma danej liczby i jej przeciwnej zawsze daje ten sam wynik - zero. Tak niestety nie jest, gdy ujemne liczby binarne różnią się od dodatnich tylko bitem znaku - przekonajcie się o tym, wybierając w tabeli kilka par liczb przeciwnych z trzeciej kolumny oraz odpowiadające im rozwinięcia binarne z pierwszej kolumny w tej tabeli.



Własność sumowania do zera pary liczb przeciwnych w zapisie binarnym ma reprezentacja uzupełnieniowa, zwana również kodem uzupełnieniowym. Tworzymy ją w następujący sposób. Dla dowolnej liczby całkowitej "a", jej reprezentacja uzupełnieniowa na "n" bitach, przeznaczonych na reprezentację, (włacznie z bitem znaku) ma postać:
  • reprezentacja binarna liczby "a", gdzy a≤0
  • reprezentacja binarna liczby 2n + "a", gdy a<0
W tym przypadku dla n=7 mamy:
  • 25 = 0011001
  • -25 = 1100111,
gdyż ma to być reprezentacja liczby 27 +(-25) = 128 - 25 = 103,
Sprawdzimy, ile wynosi suma podanych wyżej liczb:
25 + (-25) = 0011001 + 1100111 = (1) 0000000
Wynik ograniczyliśmy do 7 bitów, bo na tylu bitach są pamiętne obie dodawane liczby, zatem pomijamy bit o wartości 1 powstały z przeniesienia.

Algorytm: Przedstawianie liczby ujemnej w reprezentacji uzupełnieniowej
Dane:
Binarne rozwinięcie liczby naturalnej "a" (wraz z bitem znaku równym 0).
Wynik:
Binarne rozwinięcie liczby przeciwnej -a (wraz z bitem znaku) w reprezentacji uzupełnieniowej.

Krok. Posuwając się od prawej do lewej, czyli w kierunku od najmniej znaczącego bitu, pozostawiaj bez zmian wszystkie początkowe bity równe zero  i pierwszy bit równy 1, a każdy następny bit zamień na przeciwny, czyli 0 na 1, a 1 na 0.

Reprezentacja stałopozycyjna liczb


  • Reprezentacja stałopozycyjna charakteryzuje się stałym położeniem kropki dziesiętnej.
  • Na część całkowitą liczby oraz na część ułamkową przeznaczona jest stała, z góry określona liczba bitów.
  • Jeśli na część ułamkową przeznaczone jest 0 bitów to reprezentacja stałopozycyjna służy do przechowywania liczb całkowitych.
  • Jeśli liczba, którą chcemy przedstawić w tej reprezentacji, mieści się na ustalonej liczbie bitów, to może być reprezentowana dokładnie.
  • Jeśli wynik działań wykonywanych na liczbach stałopozycyjnych nie mieści się na ustalonej liczbie bitów, powstaje nadmiar w obliczeniach (wynik jest błędnie interpretowany przez komputer).
Mając do dyspozycji n bitów możemy w reprezentacji stałopozycyjnej przedstawić liczby całkowite z zakresu:
-2n-1 .. 2n-1-1

Przykład
n=8:    -27 .. 27-1, czyli -128 .. 127, odpowiada to typowi danych ShortInt (C++: char)
n=16:   -215 .. 215-1, czyli -32788 .. 32787, odpowiada to typowi danych Integer (C++: short)
n=32:   -231 .. 231-1, czyli -2 147 483 648 .. 2 147 483 647, odpowiada to typowi danych LongInt (C++: int)

Deklaracja odpowiedniego typu zmiennych w programie określa dopuszczalny zakres danych.


Reprezentacja zmiennopozycyjna liczb

  • Reprezentacja zmiennopozycyjna charakteryzuje się zmiennym położeniem kropki dziesiętnej.
    Przykład
602252000000000000000000*101
   
wartość liczby jest w każdym przypadku taka sama, zmienia się tylko położenie kropki dziesiętnej
   
6,02252*1023
   
0,602252*1024
   
602252*1022
   
  • W podobny sposób przedstawiane są liczby w formacie naukowym w arkuszu kalkulacyjnym: 4,92e36, czyli 4,92*10+36

Aby liczby zapisane w ten sposób można było porównywać ze sobą, stosuje się znormalizowaną reprezentację zmiennopozycyjną, gdzie liczba przedstawiona jest jako iloczyn
a=m*10c
m - mantysa,  0,1<=|m|<1
c - cecha, liczba całkowita 
Przykład: 0,662607*10-33


Podstawa matematyczna

Wartość liczby zmiennoprzecinkowej jest obliczana według wzoru:
gdzie:
  • S (ang. sign) – znak liczby, 1 lub -1
  • M (ang. mantissa) – znormalizowana mantysa, liczba ułamkowa
  • B (ang. base) – podstawa systemu liczbowego (2 dla systemów komputerowych)
  • E (ang. exponent) – wykładnik, liczba całkowita
Mantysa jest znormalizowana, tj. należy do przedziału  (przedział prawostronnie otwarty!). Jeżeli M jest stałe, a E zmienia się, wówczas przesunięciu ulega przecinek – stąd właśnie pochodzi nazwa tej reprezentacji.
Zarówno dla mantysy jak i wykładnika liczba cyfr jest z góry ustalona. Zatem dana liczba jest reprezentowana z pewną skończoną dokładnością i należy do skończonego zbioru wartości.

Brak komentarzy:

Prześlij komentarz