Temat 4. Kodowanie liczb

Transkrypt

Temat 4. Kodowanie liczb
Temat 4. Kodowanie liczb
Spis tre ci do tematu 4
4.1. Kodowanie liczb stałopozycyjnych
4.1.1. Naturalny kod binarny NKB
4.1.2. Kod dwójkowo-dziesi tny BCD
4.1.3. Kod Graya
4.1.4. Kod znak-moduł
4.1.5. Kod uzupełnie do dwóch U2
4.2. Kodowanie liczb zmiennopozycyjnych
4.2.1. Ogólne zasady kodowania liczb zmiennoprzecinkowych
4.2.2. Kodowanie liczb zmiennoprzecinkowych wg. normy
IEEE 754
4.2.3. Niestandardowe typy zmiennoprzecinkowe
4.3. Kolejno
- little-endian
- big-endian
4.4. Literatura
zapisu bajtów liczb wielobajtowych
www.if.p.lodz.pl/marek.izdebski/tc/
T4-1
4.1. Kodowanie liczb stałopozycyjnych
4.1.1. Naturalny kod binarny NKB
(ang. natural binary code)
n-bitowe słowo X = < xn–1, xn–2, ..., x1, x0 > reprezentuje w NKB
liczb całkowit nieujemn o warto ci
x=
n−1
i =0
2i xi
(4.1)
Konwersja kodu NKB na kod dziesi tny
Konwersja wykonywana przez ludzi
Przykład: liczba 00101001 w NKB odpowiada w kodzie dziesi tnym
x = 2 7 ⋅ 0 + 2 6 ⋅ 0 + 25 ⋅1 + 2 4 ⋅ 0 + 23 ⋅1 + 2 2 ⋅ 0 + 21 ⋅ 0 + 2 0 ⋅1 = 32 + 8 + 1 = 41
T4-2
Konwersja kodu NKB na kod dziesi tny
Konwersja w programie komputerowym
Kolejne cyfry w kodzie dziesi tnym D = < dn–1, dn–2, ..., d1, d0 >
znajdujemy wg. algorytmu
Przykład oblicze :
1) dana x := 001010012 = 4110
2) d0 := 4110 mod 1010 (wynik 110)
3) x := int(4110/1010) (wynik 410)
4) d1 := 410 mod 1010 (wynik 410)
5) x := int(410/1010) (wynik 010)
6) koniec, bo x = 0
Otrzymano słowo cyfr dziesi tnych
<d1, d0> = <4, 1>
Rys. 4.1. Algorytm konwersji liczby
całkowitej w NKB na liczb w
systemie dziesi tnym.
T4-3
Konwersja kodu dziesi tnego na NKB
Konwersja wykonywana przez ludzi
Konwersja liczby przedstawionej w
kodzie dziesi tnym na NKD przez ludzi
przywykłych do u ywania tylko kodu
dziesi tnego wymaga iteracyjnego
powtarzania dzielenia przez dwa oraz
znajdowania reszty z tego dzielenia.
Przykład: przedstawi liczb 3710 w NKB
1) 37 / 2 = 18 i reszta z dzielenia 1 → x0 = 1
2) 18 / 2 = 9 bez reszty z dzielenia → x1 = 0
3) 9 / 2 = 4 i reszta z dzielenia 1 → x2 = 1
4) 4 / 2 = 2 bez reszty z dzielenia → x3 = 0
5) 2 / 2 = 1 bez reszty z dzielenia → x4 = 0
6) 1 / 2 = 0 i reszta z dzielenia 1 → x5 = 1
7) koniec gdy zerowy wynik dzielenia.
Konwersja w programie komputerowym
W programach komputerowych kod
NKB jest bezpo rednio stosowany do
kodowania zmiennych całkowitych.
Je eli dane s kolejne cyfry d0, d1, ..., dn
liczby w kodzie dziesi tnym, to warto
w NKD obliczamy wprost ze wzoru:
x=
n −1
i
10 d i
(4.2)
i =0
Wynik konwersji: 1001012 = 3710
Znaczenie znajomo ci reguł konwersji pomi dzy kodem dziesi tnym i NKB
Procedury konwersji dostosowane do specyfiki konkretnego zadania s zazwyczaj
krótsze i szybsze od procedur z bibliotek standardowych.
T4-4
4.1.2. Kod dwójkowo-dziesi tny BCD
(ang. binary coded decimal)
Jedna cyfra dziesi tna jest kodowana przy u yciu grupy czterech bitów zwanych
tetrad (ang. nibble).
upakowany kod BCD
(ang. packed BCD)
nieupakowany kod BCD
(ang. unpacked BCD)
Rys. 4.2. Format liczb w upakowanym i nieupakowanym kodzie BCD.
Szczególnym przypadkiem nieupakowanego kodu BCD jest liczba całkowita
przedstawiona jako tekst ASCII, gdzie w miejscu „xxxx” musi wyst pi 00112. Kod
ASCII znaku drukarskiego 0 wynosi 4810 = 001100002; kolejnym cyfrom przypisano
kolejne kody.
T4-5
4.1.3. Kod Graya
Ka de dwie kolejne liczby zapisane w kodzie Graya ró ni si dokładnie jednym bitem.
Wa niejsze zastosowania kodu Graya:
Kod Graya został opracowany w celu zwi kszenia odporno ci układów kontroli
i sterowania, w których mo e wyst pi niejednczesne przeł czenie na
poszczególnych przeł cznikach lub przewodach u ywanych do kodowania liczb
wielobitowych.
Obecnie kod Graya (wersja BRGC) jest cz sto wykorzystywany do syntezy
i minimalizacji wyra e logicznych, np. w graficznej metodzie tablic Karnaugha.
Dla danej długo ci słowa (liczby bitów)
istnieje wiele mo liwych kodów Graya.
Rys. 4.3. Przykład ró nych mo liwo ci zapisu kolejnej
liczby w kodzie Graya gdy okre lony jest zapis liczb
poprzednich.
T4-6
Zazwyczaj przez kod Graya rozumie si kod BRGC (ang. binary-reflected Gray
code), który pozwala na wyj tkowo proste tworzenie kolejnych liczb na
podstawie tablicy wcze niejszych liczb. Istnieje tylko jeden kod BRGC.
Rys. 4.4. Wykorzystanie zgodno ci bitów w dwóch kolejnych grupach 2n–1
liczb do prostego generowania liczb w n-bitowym kodzie BRGC.
T4-7
4.1.4. Kod znak-moduł (ang. sign-magnitude)
Liczba całkowita w kodzie znak-moduł jest zdefiniowana jako zespół
x = (–1)S · M,
Rys. 4.5. Format liczby 8 bitowej
w kodzie znak-moduł.
znak-moduł
01111111
...
00000001
00000000
10000000
10000001
...
11111111
dziesi tnie
127 ← maksimum
1
+0 dwa sposoby
–0 kodowania zera
–1
(4.3)
gdzie: S - znak (ang. sign),
M - moduł (ang. magnitude).
Zastosowanie:
W standardzie kodowania liczb
zmiennoprzecinkowych IEEE 754 znak
liczby oraz moduł mantysy s kodowane
niezale nie i razem mo na je rozwa a
jako mantys ze znakiem w kodzie znakmoduł.
–127 ← minimum
Tabela 4.1. Charakterystyczne warto ci w kodzie znak-moduł dla liczby 8-bitowej.
T4-8
4.1.5. Kod uzupełnie do dwóch U2
(ang. two’s complement)
Liczby w kodzie U2 s zapisywane nast puj co:
liczby dodatnie i zero:
kodowane jak w NKB (bez u ycia najbardziej znacz cego bitu = 0)
liczby ujemne wg zale no ci:
(4.4)
− X = X +1
gdzie: – X jest negacj arytmetyczn X, X jest negacj bitow X.
kod U2
111110012
dziesi tnie
=
-710
negacja bitów
000001102
=
+610
=
+710
Procedura obliczania liczby –X w kodzie U2:
1). Zanegowa wszystkie bity liczby X.
2). Doda 1.
+1
000001112
Rys. 4.6. Przykład obliczania modułu z liczby –7 zapisanej w kodzie U2.
T4-9
znak-moduł
01111111
...
00000001
00000000
11111111
...
10000000
dziesi tnie
127 ← maksimum
Tabela 4.2. Charakterystyczne
warto ci w kodzie U2 dla liczby
8-bitowej.
1
0
–1
–128 ← minimum
Je eli X jest kodowane przy u yciu n bitów, to zachodzi zwi zek
2n – NKB(X) = NKB(–X),
(4.5)
gdzie NKB(...) – rzutowanie (konwersja) bez ingerencji w bity.
binarnie
dziesi tnie
8
1 00000000 = 2 = 25610
- 11111101 ← NKB(-310 w U2) = 25310
00000011 = 310
Rys. 4.7. Przykład obliczania modułu z liczby –3 przy wykorzystaniu
wła ciwo ci uzupełniania –X oraz NKB(X) do 2n w n-bitowym kodzie U2.
T4-10
Zastosowanie:
Kod U2 jest powszechnie wykorzystywany do reprezentowania liczb całkowitych ze
znakiem w systemach komputerowych i mikrokontrolerach. Ten sam układ logiczny
umo liwia poprawne sumowanie i odejmowanie w kodach NKB i U2, tak e w
przypadku mieszanych argumentów NKB i U2 dla działa sumy i ró nicy.
Rys. 4.8. Przykład poprawnej operacji
arytmetycznej na dwóch argumentach
wyra onych w kodach NKB oraz U2.
Uzyskany wynik jest prawidłowy
zarówno w kodzie NKB jak i U2.
Przykład wykorzystania wła ciwo ci kodu U2 do optymalizacji programu
generowanego przez kompilatory j zyków C/C++.
signed int suma(signed int a1, unsigned int a2) {
/* poprawne wykonanie tego sumowania nie wymaga
konwersji argumentów do typu danych o szerszym zakresie */
return a1 + a2;
}
signed int a = -7;
unsigned int b = 3;
signed int w = suma(a, b);
T4-11
4.2. Kodowanie liczb zmiennopozycyjnych
4.2.1. Ogólne zasady kodowania liczb
zmiennopozycyjnych
Liczba zmiennopozycyjna (zmiennoprzecinkowa) jest zdefiniowana jako zespół
x = (–1)S • M • 2E,
gdzie:
S – znak (ang. sign),
M – mantysa (ang. mantissa),
E – wykładnik (ang. exponent).
Wykładnik zazwyczaj zapisuje si jako przesuni t liczb bez znaku
(ang. biased exponent)
E = Eb – B,
gdzie:
(4.6)
E – warto wykładnika,
Eb – zapis bez znaku w NKB z przesuni ciem,
B – przesuni cie (ang. bias) zale ne od zakresu warto ci Eb.
(4.7)
T4-12
Liczby znormalizowane (ang. normalized numbers)
Z wielu mo liwych reprezentacji danej liczby zmiennoprzecinkowej wybiera si tak
która zawiera najwi cej cyfr znacz cych w mantysie (po pomini ciu zer nieznacz cych
z lewej strony mantysy). W liczbie znormalizowanej najbardziej znacz ca cyfra (bit
przy kodowaniu binarnym) mantysy zawsze ≠ 0.
Liczby zdenormalizowane (ang. denormal numbers)
Liczby w których nast piła utrata precyzji mantysy. Najbardziej znacz ca cyfra (bit
przy kodowaniu binarnym) mantysy = 0.
Przykład:
Załó my, e w formularzu mo emy zapisa tylko 5 cyfr mantysy, 2 cyfry wykładnika
oraz znaki +/– dla mantysy i wykładnika. Normalizacja wyniku działania na liczbach
znormalizowanych mo e by niewykonalna przy powy szych ograniczeniach, np.
3.2003 ⋅ 10 −99 / 1.0 ⋅ 10 +1 = ? (brak miejsca na zapis 3.2003 ⋅ 10 −100 )
Dwie mo liwo ci zapisu wyników bliskich zero, których nie da si znormalizowa :
1) zaokr glenie do zera, czyli raptowny niedomiar (ang. abrupt underflow), np.
3.2003 ⋅ 10 −99 / 1.0 ⋅ 10 +1 = 0,
2) u ycie liczby zdenormalizowanej, stopniowy niedomiar (ang. gradual underflow)
3.2003 ⋅ 10 −99 / 1.0 ⋅ 10 +1 = 0.3200 ⋅ 10 −99.
T4-13
4.2.2. Kodowanie liczb zmiennoprzecinkowych
wg. normy IEEE 754
Formaty liczb zmiennoprzecinkowych okre lone w normie IEEE 754 s obecnie
powszechnie wykorzystywane zarówno w systemach komputerowych jak i w
małych mikrokontrolerach.
Podstawowe zało enia przyj te w normie IEEE 754:
1). Mantysa składa si z jednobitowej cz ci całkowitej i wielobitowej cz ci
ułamkowej.
Mantysa liczb znormalizowanych
1 ≤ M < 2,
mantysa liczb zdenormalizowanych
M < 1.
2). Bardzo małe liczby przedstawiane s jako liczby zdenormalizowane.
3). Odró nia si nast puj ce typy liczb i symboli:
liczba 0: E = Emin; M = 0; S = 0 albo 1 (odró niane zero ze znakiem + albo –),
liczby zdenormalizowane: E = Emin; 0 < M < 1.0,
liczby znormalizowane: Emin < E < Emax,
±∞: E = Emax; M = 0; S = 0 albo 1,
NaN - nieliczba (ang. not a number): E = Emax; M ≠ 0; S – nieistotne.
T4-14
Norma IEEE 754 precyzuje dwa typy zmiennoprzecinkowe:
1). Pojedyncza precyzja (ang. float, single precision)
Warto liczby wyznacza si ze wzoru:
x = (–1)S · M · 2(Eb – 127).
(4.8)
Liczba cyfr znacz cych w zapisie dziesi tnym: 6...7.
Rys. 4.9. Format liczb zmiennoprzecinkowych IEEE 754 pojedynczej precyzji,
gdzie: S - znak, M - mantysa w NKB, EB - wykładnik bez znaku w NKB z
przesuni ciem.
2). Podwójna precyzja (ang. double precision)
Warto liczby wyznacza si ze wzoru:
x = (–1)S · M · 2(Eb – 1023).
(4.9)
Liczba cyfr znacz cych w zapisie dziesi tnym: 15...16.
Rys. 4.10. Format liczb zmiennoprzecinkowych IEEE 754 podwójnej precyzji.
T4-15
Uwaga: w formatach IEEE 754 bit cz ci całkowitej mantysy nie jest jawnie
przechowywany – warto tego bitu jest odtwarzana na podstawie wykładnika Eb
M = 0.(cz
ułamkowa M) dla E = Emin,
M = 1.(cz
ułamkowa M) dla E > Emin.
Rys. 4.11. Przykład kodowania liczby o warto ci 710 jako liczby
zmiennoprzecinkowej pojedynczej precyzji zgodnej z IEEE 754.
T4-16
Tabela 4.3. Reprezentacja binarna liczb zmiennoprzecinkowych
w pojedynczej i podwójnej precyzji.
liczba
lub symbol
reprezentacja binarna
M - cz
poza pami ci
S
E
ułamkowa
M - cz
całkowita
0
0/1
000...000
000...000
0
liczby
zdenorm.
0/1
000...000
...
000...000
111...111
...
000...001
0
liczby znorm.
0/1
111...110
...
000...001
111...111
...
000...000
1
±∞
0/1
111...111
000...000
1
NaN
0/1
111...111
111...111
...
000...001
1
Ponadto w nowszych wydaniach normy oraz koprocesorów x87 odró nia si nieliczby
pasywne (ang. quiet NaN) oraz nieliczby aktywne (ang. signaling NaN). Nieliczby
pasywne mog by bezpiecznie u ywane jako argumenty operacji, natomiast u ycie
nieliczby aktywnej powoduje zgłoszenie wyj tku niedozwolonej operacji.
T4-17
4.2.3. Niestandardowe typy zmiennoprzecinkowe
Przykład 1
Wewn trzny format extended precision rejestrów koprocesora x87 - mo na u ywa
tak e w pami ci operacyjnej jako liczb 80-bitow (1 bit znaku, 15 bitów wykładnika,
64 bitów mantysy).
Warto liczby wyznacza si ze wzoru:
x = (–1)S · (I.M) · 2(Eb – 16383).
(4.9)
Liczba cyfr znacz cych w zapisie dziesi tnym: 18...19.
Rys. 4.12. Wewn trzny format liczb zmiennoprzecinkowych w koprocesorach x87.
Oznaczenia: S - znak, EB - wykładnik bez znaku w NKB z przesuni ciem, jawny
bit I cz ci całkowitej mantysy, M – cz
ułamkowa mantysa w NKB.
Reguły rozró niania liczb znormalizowanych, zdenormalizowanych, 0, ±∞, oraz NaN,
s w znacznym stopniu zgodnie z norm IEEE754. Jawny bit I powoduje odró nianie
liczb nieznormalizowanych, które nie s to same z liczbami zdenormalizowanymi.
T4-18
Przykład 2
Zmodyfikowany typ float IEEE 754 w kompilatorze
HI-Tech C for the PIC 10/12/16 MCU Family.
Ten typ danych skrócono do 24-bitów przez obci cie najmniej znacz cych bitów mantysy.
Rys. 4.13. Format 24-bitowych (1 bit znaku, 8 bitów wykładnika, 15 bitów mantysy)
liczb zmiennoprzecinkowych opracowany przez skrócenie formatu IEEE 754
pojedynczej precyzji.
T4-19
Przykład 2
Typ float w CCS C Compiler for PIC 12/14/16/18. Zachowano daleko id c zgodno
IEEE 754 z wyj tkiem przesuni składników.
z
Rys. 4.14. Niestandardowy format 32-bitowych liczb zmiennoprzecinkowych
pojedynczej precyzji. Przesuni cie wykładnika E oraz bitu znaku S, wprowadzono
w celu przyspieszenia oblicze w 8-bitowej jednostce arytmetyczno-logicznej.
T4-20
4.3. Kolejno
zapisu bajtów liczb wielobajtowych
Kolejno
poszczególnych bajtów liczb wielobitowych przechowywanych w
pami ci operacyjnej systemu mikroprocesorowego zale y od budowy jednostki
centralnej CPU/MPU. W praktyce wyst puj najcz ciej trzy główne przypadki:
little-endian (Intel x86, VAX)
najmniej znacz cy bajt pod najni szym adresem,
big-endian (Motorolla 68000)
najmniej znacz cy bajt pod najwy szym adresem,
bi-endian (Alpha, ARM, MIPS, PowerPC)
sprz towe wsparcie dla obu kolejno ci little-endian i bi-endian.
W prostych systemach 8-bitowych kolejno jest okre lona przez oprogramowanie, np.
w kompilatorze HI-Tech C for the PIC 10/12/16 MCU Family
little-endian – wszystkie typy całkowite i zmiennoprzecinkowe,
w CCS C Compiler for PIC 12/14/16/18
little-endian – wszystkie typy całkowitoliczbowe,
big-endian – typ zmiennoprzecinkowy float.
T4-21
Ró nice w kolejno ci zapisu bajtów utrudniaj przenoszenie mi dzy systemami
zarówno plików ródłowych oprogramowania jak i danych zapisanych w postaci
binarnej.
Przykład nieprzeno nego ródła programu w j zyku C
/* wersja dla little-endian */
union {
unsigned short val;
unsigned char bajty[2];
} uval;
/* wersja dla big-endian */
union {
unsigned short val;
unsigned char bajty[2];
} uval;
/* pobierz mniej znacz cy bajt */
uval.bajty[0] = pomiar_lo();
/* pobierz mniej znacz cy bajt */
uval.bajty[1] = pomiar_lo();
/* pobierz bardziej znacz cy bajt */
uval.bajty[1] = pomiar_hi();
obliczenia(uval.val);
/* pobierz bardziej znacz cy bajt */
uval.bajty[0] = pomiar_hi();
obliczenia(uval.val);
T4-22
Przykład niezgodno ci na poziomie wymiany danych w plikach binarnych.
Rys. 4.15. Ryzyko bł dnej wymiany danych w plikach mi dzy systemami littleendian oraz big-endian. Oba pliki zostały zapisane przy u yciu programów
identycznych na poziomie kodu ródłowego.
Tekst ródłowy programu do przykładu na rys. 2.15.
unsigned short wynik = pobierz_pomiar();
/* Otwórz plik binarny do zapisu */
FILE * f = fopen("C:\\pomiary\\wyniki1.bin", "wb");
fwrite(&wynik, sizeof(wynik), 1, f);
...
T4-23
Przykładowe rodki zaradcze na problemy z kolejno ci zapisu bajtów:
1. Wymiana danych poprzez pliki tekstowe ASCII.
2. Zdefiniowanie jednego formatu pliku i przygotowanie osobnych wersji programu
dla systemów little-endian i big-endian.
3. Przygotowanie jednej wersji programu dla maszyny wirtualnej. W Javie dane s
zapisywane do plików binarnych w kolejno ci big-endian niezale nie od sprz tu.
Odwrócenie kolejno ci bajtów wymaga operacji jawnie zapisanych w programie.
4.4. Literatura
[1] H. Kamionka-Mikuła, H. Małysiak, B. Pochopie , Synteza i analiza układów
cyfrowych, Wydawnictwo Pracowni Komputerowej Jacka Skamierskiego,
Gliwice 2006.
[2] M. Tuszy ski, R. Goczy ski, Koprocesory 80287, 80387 oraz i486, Komputerowa
Oficyna Wydawnicza „Help”, Warszawa 1992.
[3] J. Kalisz, Podstawy elektroniki cyfrowej, WKiŁ, Warszawa 2002.
[4] P. Misiurewicz, Układy automatyki cyfrowej, Wydawnictwa Szkolne i Pedagogiczne,
Warszawa, 1984.
[5] A. Barczak, J. Florek, T. Sydoruk, Elektroniczne techniki cyfrowe,
VIZJA PRESS&IT Sp. z o.o., Warszawa 2006.
[6] A. Skorupski, Podstawy techniki cyfrowej, WKiŁ, Warszawa 2004.
[7] Dokumentacja kompilatorów HI-Tech C for the PIC 10/12/16 MCU oraz
CCS C Compiler for PIC 12/14/16/18 (w zainstalowanych kompilatorach).
T4-24

Podobne dokumenty