Stało- i zmiennopozycyjna reprezentacja liczb binarnych ₥@ʁ€₭ ‽ud3£k0 Urządzenia Techniki Komputerowej Reprezentacja liczb w systemie komputerowym • Reprezentacja liczb w systemie komputerowym polega na zamianie zbioru liczb rzeczywistych na odpowiadające im liczby binarne. – Chcąc zapisać liczby w systemie komputerowym musimy dokonać pewnego uproszczenia. Reprezentacja liczb w systemie komputerowym • Ile jest liczb rzeczywistych? • Ile liczb zmieści się w pamięci komputera? Odwzorowanie liczb w systemie komputerowym • Chcąc zapisać liczby w systemie komputerowym musimy dokonać pewnego uproszczenia. Liczby rzeczywiste Liczby w komputerze R1 R3 R2 K5 R4 R5 R6 K1 R7 K3 K2 K4 Reprezentacja liczb całkowitych • w komputerze liczby przechowywane są w pamięci lub w rejestrach procesora o ustalonej liczbie pól, np. 8 lub 16 • Problemy – Problem przepełnienia - gdy liczba jest zbyt duża, by móc ją zapisać przy pomocy np. 8 bitów – Problem niedopełnienia - gdy liczba jest za mała, by ją zapisać przy pomocy np. 8 bitów – Jak zapisywać liczby ujemne? – Pewne liczby musimy pominąć – które i według jakiego algorytmu? Reprezentacje liczb z częścią ułamkową • Zapis stałoprzecinkowy • Zapis zmiennoprzecinkowy Binarna liczna stałoprzecinkowa • Binarną liczbę stałoprzecinkową można potraktować jako złożenie dwóch części — liczby całkowitej oraz ułamkowej rozdzielonych przecinkiem: Część całkowita Część ułamkowa 10110011, 0101 Zapis stałoprzecinkowy • Aby umożliwić również zapis liczb ułamkowych, musimy rozszerzyć wagi pozycji w stronę ujemnych potęg podstawy. • Część ułamkową oddzielimy od części całkowitej zapisu za pomocą znaku przecinka. waga pn-1 … p2p1p0 , p-1p-2 … p-m cyfry an-1 … a2a1a0 , a-1a-2 … a-m Zamiana liczby rzeczywistej dziesiętnej na binarną • Zamianę liczby dziesiętnej na postać binarną przeprowadza się w dwóch etapach: 1. zamiana liczby całkowitej na postać binarną za pomocą cyklicznego dzielenia przez 2; 2. zamiana części ułamkowej na postać binarną za pomocą cyklicznego mnożenia przez 2. Jeżeli wynik jest > 1, to wyznaczony bit części ułamkowej jest także równy 1. Do dalszych obliczeń wykorzystujemy część ułamkową wyniku. – Proces należy kontynuować aż do otrzymania 0. – Z wyników iloczynów pobieramy wartości całkowite — ułamek liczby binarnej. Otrzymane liczby łączymy, przedzielając część całkowitą i ułamkową przecinkiem. – Jeżeli mnożenie przez 2 prowadzi do osiągnięcia nieskończenie długiej kombinacji zer i jedynek, należy przyjąć przybliżoną dokładność, np. do 10 miejsc po przecinku. Zamiana liczby dziesiętnej na binarną • Przykład • Zamieniamy liczbę 10,225 na liczbę binarną. 1.Podział liczby na cześć całkowitą i ułamkową Część całkowita Część ułamkowa 10, 225 2. Zamiana części całkowitej na binarną Dzielna Dzielnik Reszta z dzielenia 10 :2 0 5 2 :2 :2 1 0 1 :2 1 0 1010=10102 11 3. Zamiana części ułamkowej na binarną 1 2 3 4 5 6 7 8 9 10 Mnożna Mnożnik Wynik Część całkowita 0,225 0,45 0,9 0,8 0,6 0,2 0,4 0,8 0,6 0,2 0,45 0,9 1,8 1,6 1,2 0,4 0,8 1,6 1,2 0,4 0 0 1 1 1 0 0 1 1 0 *2 *2 *2 *2 *2 *2 *2 *2 *2 *2 12 4. Połączenie liczb • Uzyskane liczby binarne scalamy w jedną. Część całkowita Część ułamkowa 10 0,225 1010 0,0011100110 10,225 1010, 0011100110 Ćwiczenie zamiana na postać binarną 1. 25,34 2. 56,95 3. 18,77 4. 21,88 5. 32,65 6. 55,55 7. 11,85 8. 34,42 9. 44,21 10.49,39 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 15,344 53,953 16,771 31,886 42,657 45,558 41,853 54,425 24,219 39,393 Zamiana liczb binarnych na dziesiętne • Chcąc zamienić liczbę binarną stałoprzecinkową na postać dziesiętną należy skorzystać z poniższego wzoru: an-1…a1a0,a-1…a-m=an-1*pn-1+a1*p1+a0*p0,a-1*p-1+…+a-m*p-m • Wartości wag części ułamkowych przyjmują postać ułamków w których dokładność jest określona przez wagę najmłodszej cyfry URZĄDZENIA TECHNIKI KOMPUTEROWEJ Zamiana liczb binarnych na dziesiętne Przykład Obliczyć wartość liczby dwójkowej 11101,011B 11101,0112 = 1 * 2-3 + 1 * 2-2 + 0 * 2-1 + 1 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 1 * 24 11101,0112 = 1 * 1/8 + 1 * 1/4 + 0 * 1/2 + 1 * 1 + 0 * 2 + 1 * 4 + 1 * 8 + 1 * 16 11101,0112 = 1/8 + 1/4 + 1 + 4 + 8 + 16 11101,0112 = 29 3/8 Przykład Zamienić ułamek 12.7 na postać binarną 8-bitową, gdzie przecinek jest po czterech bitach !!!!!!! Etap 1 Część całkowita 12D to w postaci dwójkowej 1100B. Etap 2 Obliczanie części ułamkowej wygląda następująco: 0.7 * 2 = 1.4 -> 1 0.4 * 2 = 0.8 -> 0 0.8 * 2 = 1.6 -> 1 0.6 * 2 = 1.2 -> 1 0.2 * 2 = ….. – tutaj przerywamy obliczenia i stąd 12.7D = 1100,1011B Reprezentacja stałoprzecinkowa • Wady reprezentacji stałoprzecinkowej (Fixed Point Notation): B 0.000075244 A 47567.31 • 10-cyfrowy format: A 47567.31000 XXXXX.XXXXX B 0.000075244 obcięte 00000.00007 W przypadku liczb stałoprzecinkowych wystąpi duży błąd przy bardzo małych wartościach oraz bardzo dużych wartościach (w odniesieniu do powyższego formatu). Liczby rzeczywiste • Charakterystyka: Liczby rzeczywiste mają cześć całkowitą i ułamkową Nie można już przyjąć, że przecinek leży po prawej stronie (bo wtedy byśmy mieli tylko liczby całkowite) ani, że leży po lewej stronie (bo wtedy byśmy mieli tylko liczby ułamkowe) Niezbyt „ekonomiczne” byłoby używanie kodowania w systemie stałoprzecinkowym (np. przecinek rozdziela dwa bajty) • Co chcemy tak naprawdę uzyskać? • System kodowania dla którego błąd względny będzie tego samego rzędu dla wszystkich wartości biorących udział w obliczeniach. Skalowanie liczby • Dostosowywanie skali liczby ułamkowej: B 0.000075244 B 0.75244 104 B 7.5244 105 i tak dalej ... A 47567.31 A B 47567.31 0.75244 0.0001 Możliwość wykonania działania z zastosowaniem wszystkich cyfr znaczących. Wynik jednak musi być dodatkowo pomnożony przez wykładniczy współczynnik korygujący. Zapis zmiennopozycyjny Z zapisem zmiennoprzecinkowym można spotkać się w przypadkach, gdzie przy jego pomocy przedstawia się albo bardzo duże wartości, albo bardzo małe. Zapis ten nazywa się często notacją naukową, np.: Gwiazda Proxima Centauri znajduje się w odległości 9460800000000 [km], czyli 9,4608 * 1012. Masa elektronu wynosi me = 0,00000000000000000000000000091095 [g], czyli 9,1095 x 10-28 [g] 1.4.2. Liczby zmiennoprzecinkowe (zmiennopozycyjne) W porównaniu z liczbami stałoprzecinkowymi liczby zmiennoprzecinkowe (ang. floating-point numbers — FP) umożliwiają obsługę większego zakresu liczb (bardzo małych lub bardzo dużych), jednak kosztem wolniejszego przetwarzania i mniejszej dokładności. Termin „zmiennoprzecinkowe" oznacza, że nie istnieje stała liczba cyfr przed przecinkiem i po przecinku. Liczba zapisana w systemie zmiennoprzecinkowym składa się z dwóch części: liczby stałoprzecinkowej, której wartość bezwzględna jest mniejsza od wartości podstawy systemu pozycyjnego oraz z podstawy podniesionej do pewnej potęgi zwanej wykładnikiem lub cechą. Wartość liczby jest równa iloczynowi części stałoprzecinkowej i wykładniczej: w = m * be, m - mantysa, b - podstawa systemu, e - wykładnik potęgowy. 1111 1001 Liczymy cechę! 1111 e = 1(-23)+1*22+1*21+1*20 = -8 +4 +2 +1 = -1 1111 1001 Liczymy mantysę! 1001 – dzielimy na dwie części 10,01 traktujemy jak liczbę stałoprzecinkową z przedziału 1,2 10,01 m = 1(-21)+0*20+0*2-1+1*2-2 = -2 +0 +0 +1/4 = -2+1/4 = -1 ¾ = -1,75 1111 1001 cecha e = -1 LFP = m*2e LFP = -1,75 * 2-1 = -1,75 * ½ = -1,75 * 0,5 = - 0,875 mantysa m = -1,75 Zadanie - ćwiczenie Oblicz wartość liczby 1. 00010101B 2. 01010110B 3. 00011100B 4. 10110101B e = 0*(-23) + 0*22 + 0*21 + 1*20 = 0 + 0 +0+ 1 = 1 M 01,00 m = 0*(-21) + 1*20 + 0*2-1 +0*2-2 = 0+1+0+0=1 LFP = 1*21=2 Zadanie do samodzielnej analizy Obliczanie reprezentacji zmiennoprzecinkowej Mamy określony format zapisu liczby zmiennoprzecinkowej w systemie dwójkowym. Wiemy, że wykładnik ma zawierać n bitów w kodzie U2, a cecha m bitów w zapisie stałoprzecinkowym U2. Przykład prostego systemu zmiennoprzecinkowego, w którym wykładnik i cecha mają po 4 bity długości. Przykładową liczbą niech będzie wartość 56: 56D = 111000B = 0111000U2 - dodajemy zero, aby zaznaczyć, iż jest to liczba dodatnia. Zapiszemy wzór obliczeniowy, a następnie będziemy przesuwać w prawo cyfry mantysy dodając jednocześnie 1 do wykładnika, aż znacząca jedynka znajdzie się na pozycji o wadze 1/2. 0111000,000U2 =20000U2 011100,000U2 =20001U2 - przesuwamy cyfry mantysy w prawo, zwiększamy wykładnik 01110,000U2 =20010U2 0111,000U2 =20011U2 011,100U2 =20100U2 01,110U2 =20101U2 0,111U2 =20110U2 - kończymy, mantysa jest znormalizowana Otrzymujemy więc: e = 0110 = 6D m = 0,111 = 7/8, sprawdzamy: 7/8 x 26 = 448/8 = 56 Dla liczby 9D 9D = 1001B = 01001U2 01001,000U2 =20000U2 0100,100U2 =20001U2 010,010U2 =20010U2 01,001U2 =20011U2 - ostatnia jedynka zaraz zniknie!!! 0,100U2 =20100U2 - koniec Otrzymaliśmy wynik: e = 0100 = 4D m = 0,100 = 1/2, sprawdzamy: 1/2 * 24 = 16/2 = 8 9D =? 01000100ZP System zmiennoprzecinkowy • Metoda: • Kodowanie w systemie zmiennoprzecinkowym zwanym też • cecha-mantysa umożliwia zapis liczb rzeczywistych z ustalonym błędem względnym system oparty na podziale liczby na cześć ułamkową zwaną mantysą oraz na wykładnik potęgi podstawy systemu zwany cechą opracowany na podstawie zapisu liczby w systemie pozycyjnym wagowym Reprezentacja zmiennoprzecinkowa • Zmiennoprzecinkowa (Floating Point Notation) reprezentacja liczby dziesiętnej: L LM W LM p dLW • M – mantysa, liczba ułamkowa ze znakiem, przedstawiona w jednym z trzech kodów ZM, ZU1, ZU2, • W – wykładnik lub cecha, liczba całkowita ze znakiem przedstawiona również w jednym z trzech kodów (nie koniecznie tym samym co M), • p – wspólna podstawa kodów zastosowanych do zapisu słów M i W, • Normalizacja liczby zmiennoprzecinkowej Liczba zmiennoprzecinkowa jest znormalizowana, jeśli mantysa spełnia warunek: pd L M 1 • Podczas czynności normalizacji następuje odpowiednie przesunięcie pozycji kropki dziesiętnej („przecinka”), co uzasadnia nazwanie tej notacji zmiennoprzecinkową. • W przypadku liczb dwójkowych odbywa się to poprzez przesunięcie cyfr znaczących w prawo lub w lewo, w zależności od tego czy przecinek należy przesunąć w kierunku liczb małych, czy też dużych. Liczby zmiennoprzecinkowe w praktyce • Metodyka dostosowywania liczby zmiennoprzecinkowej: • Przykład: Przyjęto jednobajtowe słowo dwójkowe M i W w kodzie ZU2. Zadanie: Przedstawienie liczby dziesiętnej L = -4.25 w dwójkowym zapisie zmiennoprzecinkowym, znormalizowanym. ZU 2 L 1.011.11 Przekształcenie liczby L na liczbę dwójkową w kodzie ZU2: L L 1.01111 23 2. Normalizacja poprzez przesunięcie przecinka dziesiętnego (warunek – poprzedni slajd): M W 1.01111000.0000011 M 3. Stosując 8-bitowy kod ZU2 dla słów mantysy i wykładnika otrzymujemy dwójkowy zapis zmiennoprzecinkowy: L W 1 5 3 3 LM p 4. W Sprawdzenie: 2 2 2 0.53125 2 4.25 Wirtualne kropki 1. Standard IEEE 754 Pojedyncza precyzja: mantysa 23 bity, wykładnik 8 bitów (nadmiar 127), znak 1 bit bajt 4 bajt 3 bit 31 bajt 2 bajt 1 2322 0 Znak S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM Wykładnik Wartość: Mantysa 1/4 1/16 1/64 itd. 1/2 1/8 1/32 itd.. Mantysa jest znormalizowana do zmniejszonej podstawy wykładnika (kodowanie w formacie U1) 1/2 23 Standard IEEE 754 • Procedura zapisu: 1) 2) 3) 4) 5) 6) Określamy znak: Bit31= 1 jeżeli liczba ujemna, 0 jeżeli dodatnia Szukamy największej liczby postaci 2w mniejszej niż liczba Jedynka Zapisujemy wykładnik = w + nadmiar wiodąca Dzielimy liczbę przez 2w (wynik będzie miał postać 1.xxxx) Odejmujemy 1 i szukamy mantysy Zaznaczamy bit jako 1 jeżeli po odjęciu 1/(2(23-bit)) (dla pojedynczej precyzji) mamy wartość nieujemną. Jeżeli otrzymamy wartość ujemną, zaznaczamy bit jako 0 i ignorujemy tę operację. Procedurę powtarzamy aż w wyniku odejmowania otrzymamy 0 lub dojdziemy do bitu nr 0. Konwerter z liczby dziesiętnej na dwójkową w standardzie IEEE 754 • 1) 2) 3) 4) 5) • • • • • Standard IEEE 754 Przykład: (zapisujemy liczbę 14.5) (nadmiar 127) Liczba jest dodatnia Bit31 = 0 Największa liczba 2w mniejsza niż 14.5 to 23 = 8 w = 3 Zapisujemy wykładnik = 127 + w = 130 10000010 14.5/23 = 1.8125 odejmujemy 1 i otrzymujemy 0.8125 0.8125-1/2=0.3125 bit22 = 1 0.3125-1/4=0.0625 bit21 = 1 0.0625-1/8= -0.0625 bit20 = 0 ignorujemy operację 0.0625-1/16= 0.0 bit19 = 1 Pozostałe bity mantysy = 0 01000001011010000000000000000000 wykładnik znak mantysa Standard IEEE 754 •Pojedyncza precyzja: mantysa 23 bity, wykładnik 8 bitów, znak 1 bit, nadmiar 28/2 - 1 = 127 •Podwójna precyzja: mantysa 52 bity, wykładnik 11 bitów, znak 1 bit, nadmiar 211/2 - 1 = 1023 •Rozszerzona podwójna precyzja: mantysa 64 bity, wykładnik 15 bitów (nadmiar 264/2 - 1 = 16383), znak 1 bit Standard IEEE 754 • Precyzja jest określana przez liczbę miejsc po przecinku, czyli jest określana przez mantysę. • Najmniejsza wartość możliwa do zapisania w mantysie • Pojedyncza precyzja: • Mantysa ma 23 bity 1/223 ≈ 1.2* 10-7 7 cyfr po przecinku • Podwójna precyzja • Mantysa ma 52 bity 1/252 ≈ 2.2* 10-16 15-16 cyfr po przecinku • Rozszerzona podwójna precyzja • Mantysa ma 64 bity 1/264 ≈ 5.4* 10-20 19 cyfr po przecinku Znaki i teksty Teksty składają się ze znaków Podstawą zapisu jest jeden bajt 1 bajt przyjmuje 256 różnych wartości Ważną cechą kodowania jest jednoznaczność: przyjęcie pewnego sposobu kodowania powinno być powszechne: ASCII: 0 – 127 standardowe, 128 – 256 zależne od kraju Znaki specjalne 0-31 Spacja 32 Np. Cyfry 48 – 57 Wielkie litery 65 – 90 Litera W: 01010111 kod binarny 87 Małe litery 97 - 122 Pozostałe kody: Kropka, przecinek, itd… 33-47, 58-64, 91-96, 123-127 87 Kod znaku ASCII (American Standard Code for Information Interchange) W Znak Kody UNICODE • 256 znaków alfanumerycznych jakie można zakodować za pomocą rozszerzonego kodu ASCII nie dawało możliwości zakodowania znaków diakrytycznych wielu języków np. polskiego. • Odpowiedzią jest kod nazwany UNICODE o długości 16 bitów dla każdego znaku. Daje to możliwość zakodowania 216, czyli 65536 znaków.