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