str. 6
4. Reprezentacje liczb w komputerze
Kodowanie liczb opiera się na ich konwersji na system binarny. Nie mniej trzeba jeszcze pamiętad, że dana liczba zajmuje z góry określoną liczbę bitów oraz określid jak zapisad liczby ujemne i ułamki.
4.1. Liczby całkowite.
Umowa: Wszystkie liczby naturalne mają identyczny kod (na danej liczbie bitów). Najstarszy bit jest bitem znaku i dla liczb dodatnich ma wartośd zero. Pozostałe bity prezentują liczbę bn-22n-2 + ... + b222 + b121 + b020 (tzn. bit bi
ma wagę 2i). Przy kodowaniu liczb całkowitych ujemnych bit znaku przyjmuje wartośd 1 ale w różnych kodach ma różne znaczenie.
Kod ZM (kod znak-moduł)
LZM = (-1)bn-1 ∙ (bn-22n-2 + ... + b222 + b121 + b020)
26
-26
Bity bn-2,…, b2, b1, b0 są bitami modułu kodowanej liczby a bit bn-1 jest - zgodnie z umową - bitem znaku. Ten sposób kodowania ma następujące wady: występują dwie reprezentacje zera oraz nie można stosowad naturalnych operacji arytmetycznych.
Kod U2 (kod uzupełnieo do 2)
LU2 = bn-1∙(-2n-1) + bn-22n-2 + ... + b222 + b121 + b020)
W kodzie U2 najstarszy bit n-bitowej reprezentacji ma wagę -2n-1, a pozostałe bity tradycyjnie: +2n-2, +2n-3,….
Kodowanie U2 jest obecnie najpopularniejszą reprezentacją liczb całkowitych (oraz ułamkowych przedstawionych w formacie stałoprzecinkowym). Operacje dodawania i odejmowania są w nim wykonywane naturalnie.
Algorytm zapisu liczby ujemnej w kodzie U2:
1. Zapisz moduł liczby w ZM.
2. Dokonaj inwersji bitów (czyli pozamieniaj 0 na 1 i odwrotnie:);
3. Zwiększ wynik o 1.
Np. Liczba -27 na 8 bitach w U2:
1. Zapisujemy liczbę 27 na 8bitach 2. Zamieniamy bity 3. Dodajemy 1 i mamy -27 w U2
Natomiast 10101001U2 = -27+(25+23+1) = -128+41 = -87 4.2. Liczby rzeczywiste.
Zapis stałopozycyjny.
Do zapisu liczby stałoprzecinkowej przeznaczona jest z góry określona liczba bitów, a pozycję przecinka ustala się arbitralnie, w zależności od wymaganej dokładności, wolne bity uzupełniając zerami. Do reprezentacji liczb ze znakiem stosuje siejże kod U2.
Np. Liczba 6,25=110,01(2) zapisana na 8 bitach gdy częśd ułamkowa zajmuje 3 najmłodsze bity, ma postad:
Natomiast liczba -6,25=-110,01(2) zapisana w powyższym formacie w kodzie U2, ma postad:
0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0
0 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 1 0 1
0 0 1 1 0 0 1 0
1 1 0 0 1 1 1 0
część całkowita część ułamkowa
str. 7
Zapis zmiennopozycyjny.
Liczba zmiennoprzecinkowa jest komputerową reprezentacją liczb rzeczywistych zapisanych w postaci wykładniczej o podstawie 2. Na zajęciach będziemy stosowali następującą notację:
BIAS c z
C
z
M m
1 ) 2 ( 1 ) ( 1 ) 2 (
gdzie:
(-1)z - znak liczby
M=1+m - znormalizowana mantysa (liczba spełniająca warunek: 1M<2). Ponieważ przed przecinkiem stoi zawsze 1, więc można ją przedstawid w postaci 1+m, gdzie m jest liczbę ułamkową: 0m<1)
C=c-BIAS - cecha (liczba całkowita), która dzięki zastosowaniu stałej BIAS pozwoli przedstawid cechę w postaci różnicy c-BIAS (c jest liczbą całkowitą dodatnią, tzw spolaryzowana cechę)
BIAS - stała (liczba całkowita BIAS zależna od danej implementacji – rozwiązuje problem znaku cechy)
Kodujemy wyłącznie:
z - bit znaku
m - mantysę pomniejszoną o 1 c - cechę przesuniętą o BIAS
Np. Załóżmy, że operujemy następującym zmiennopozycyjnym formatem zapisu liczby rzeczywistej:
na zapis przeznaczamy 16 bitów.
najstarszy bit (b15) to bit znaku (będziemy stosowad kod ZM),
kolejne 6 bitów (b9-b14) to mantysa
pozostałe bity (b0-b8) są przeznaczone na zapis cechy i przyjmijmy, że BIAS=9.
Przedstawimy liczbę +0,0224609375 w powyższym formacie. Naszą liczbę zapisujemy w systemie binarnym w postaci wykładniczej o podstawie 2, przesuwamy przecinek zapisując ją w notacji wykładniczej:
Znak: (-1)0
0,0224609375 = 0,0000010111
(2)= 1,0111
(2) 2
-6Mantysa:
1,0111
2Cecha :
-6 = 3-9 = 11
2- BIAS
Oto liczba 0,0224609375 zapisana w zadanym formacie:
Żeby rozkodowad jakąś liczbę, np. 1101110000001101 zapisaną w powyższym formacie, przeprowadzamy operację odwrotną:
Znak: (-1)1
Mantysa:
1,10111
2=-1,10111
2∙2
4= 11011,1
2= 27,5
Cecha :1101
2– BIAS=13-9=4
Uwaga:
Powszechnie w procesorach i oprogramowaniu obliczeniowym wykorzystuje się binarny zapis zmiennopozycyjnym zgodnym ze standardem IEEE 754
(np. format 32-bitowy z polami: b31-znak, b23..30-cecha (BIAS=127), b0..22-mantysa, ).
W przedstawieniu tym cecha, która jest ciągiem zer (albo ciągiem jedynek) nadaje kodowi specjalne znaczenie, np.
01111111100000000000000000000000 + 00000000000000000000000000000000 0
Gdy cecha jest ciągiem zer, mantysa jest zdenormalizowana tzn. 0,5M<1 Ze względów dydaktycznych będziemy stosowali uproszczone formaty.
Używając formatu zmiennopozycyjnego należy pamiętad o takich zagadnieniach jak: zakres (problem z przepełnieniem i niedomiarem), zaokrąglanie, kolejnośd wykonywania działao (nie ma np. łączności)
Liczbę, którą można dokładnie zapisad w danym formacie nazywamy liczbą maszynową.
0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1
str. 8
Zadania
z.4.1. Uzupełnij tabelkę (do zapisu liczb w kodzie ZM i U2 użyj minimalnej wielokrotności 8 bitów) :
(10) ZM U2
1947 -1947
01001110 11001110
01001101 11001101 z.4.2. Podaj zakres liczb całkowitych jakie można zapisad na 8 bitach:
a) w kodzie ZM b) w kodzie U2
z.4.3. Uzasadnij, że liczba -1 w kodzie U2 jest reprezentowana zawsze jako ciąg jedynek.
z.4.4. Rozkoduj ciąg 10010001 zapisany w formacie stałopozycyjnym 8-bitowym:
a) b0..5 – częśd całkowita, b6..7 – częśd ułamkowa (bez znaku) b) b0..2 – częśd ułamkowa, b3..7 – częśd całkowita (bez znaku) c) b0..2 – częśd ułamkowa, b3..6 – częśd całkowita, b7-znak (ZM) d) b0..2 – częśd ułamkowa, b3..7 – częśd całkowita (U2)
z.4.5. Zapisz liczbę -112,09375 w 16-bitowym formacie stałopozycyjnym:
a) b0..7 – częśd ułamkowa, b8..14 – częśd całkowita, b15-znak (ZM) b) b0..7 – częśd ułamkowa, b8..15 – częśd całkowita (U2)
z.4.6. Podaj zakres i dokładnośd liczb jakie można zapisad w formacie stałopozycyjnym 8-bitowym (bez znaku):
a) gdy częśd ułamkowa zajmuje 2 najmłodsze bity b) gdy częśd ułamkowa zajmuje 5 najstarszych bitów
z.4.7. Zapisz w 16 bitowym formacie zmiennopozycyjnym: b15-znak, b7..14-znormalizowana mantysa, b0..6 spolaryzowana cecha przy BIAS=20:
a) 9,1875 b) 0,09375
c) 503 d) -9,09375 z.4.8. Rozkoduj ciąg 10010001 zapisany w formacie zmiennopozycyjnym 8-bitowym:
a) b7-znak, b3..6-znormalizowana mantysa, b0..2 spolaryzowana cecha przy BIAS=8 b) b7-znak, b3..6-znormalizowana mantysa, b0..2 spolaryzowana cecha przy BIAS =10 c) b0-znak, b4..7-znormalizowana mantysa, b1..3 spolaryzowana cecha przy BIAS =10 d) b0-znak, b1..3-znormalizowana mantysa, b4..7 spolaryzowana cecha przy BIAS =10
z.4.9. Podaj zakres jaki uzyskamy kodując liczby w formacie zmiennopozycyjnym 8 bitowym: b7-znak, b3..6- znormalizowana mantysa, b0..2-spolaryzowana cecha przy BIAS =8.
z.4.10. Wypisz i zaznacz na osi wszystkie liczby jakie można zakodowad na 4 bitach w formacie zmiennopozycyjnym, gdy najstarszy bit jest bitem znaku, dwa następne bity są bitami spolaryzowanej cechy o stałej BIAS =1, a najmłodszy bit jest bitem znormalizowanej mantysy.
z.4.11. Określ, która z liczb jest liczbą maszynową, która z przepełnienia a która z niedomiaru gdy zapisane są w formacie „zccmm” i są zapisane bez zastrzeżenia o cechach będących ciągiem jedynek i denormalizacji mantysy:
a) 2 b) 0,2
z.4.12. Rozkoduj liczy zapisane w formacie IEEE 754:
a) 01000001110110000000000000000000(IEEE 754)
b) 10111110000000000000000000000000(IEEE 754)
c) -20 d) -2,2