Informatyka 1 - PB Wydział Elektryczny
Transkrypt
Informatyka 1 - PB Wydział Elektryczny
Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 2/61 Plan wykładu nr 4 Informatyka 1 Reprezentacja stałoprzecinkowa Reprezentacja zmiennoprzecinkowa Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 2010/2011 zapis zmiennoprzecinkowy liczby rzeczywistej arytmetyka liczb zmiennoprzecinkowych zapis liczb zmiennoprzecinkowych w systemie binarnym zakres liczb zmiennoprzecinkowych Standard IEEE 754 Wykład nr 4 (08.04.2011) kod uzupełnień do dwóch (U2) liczby 32-bitowe i 64-bitowe zakres i precyzja liczb wartości specjalne dr inż. Jarosław Forenc Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 3/61 Reprezentacja liczb w systemach komputerowych Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 4/61 Reprezentacja liczb stałoprzecinkowych ze znakiem Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 5/61 Kod U2 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 6/61 Kod U2 Kod U2 (ZU2, uzupełnień do dwóch) jest najpopularniejszym sposobem zapisu liczb całkowitych ze znakiem Kod U2 (ZU2, uzupełnień do dwóch) jest najpopularniejszym sposobem zapisu liczb całkowitych ze znakiem Najstarszy bit jest bitem znaku liczby: 0 - dodatnia, 1 - ujemna Waga najstarszego bitu w liczbie to -2n-1 Wartość liczby: Liczba -2n-1 nie posiada swego przeciwieństwa w n-bitowej reprezentacji kodu U2 X (10) = x 0 ⋅ 20 + x1 ⋅ 21 + x 2 ⋅ 2 2 + ... + x n − 2 ⋅ 2 n − 2 + x n −1 ⋅ (−2 n −1 ) Kod U2 jest obecnie stosowany we wszystkich komputerach PC, Amiga, Macintosh oraz w językach programowania Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 7/61 Kod U2 dla n = 8 (reprezentacja 8-bitowa) zakres liczb to -128 … 127 liczba -128 nie posiada swego przeciwieństwa (128) W kodzie U2 dolna i górna granica zakresu liczb są niesymetryczne Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 8/61 Kod U2 Używając n-bitów można przedstawić liczby z zakresu: Zapis liczb 4-bitowych (1 bit - znak, 3 bity - moduł) w kodzie U2: Każda wartość w kodzie U2 jest reprezentowana jednoznacznie nie ma podwójnej reprezentacji zera W kodzie U2 liczb ujemnych jest o jeden więcej niż dodatnich 00...000 zawsze oznacza 0(10), a 11...111 zawsze oznacza -1(10) X (10 ) = − 2 n −1 , 2 n −1 − 1 zakres liczb 4-bitowych w kodzie U2: − 23 = − 8(10) 23 − 1 = 7 (10 ) = 0111( U 2) zakres liczb 8-bitowych w kodzie U2: − 2 7 = − 128(10) 27 − 1 = 127 (10) = 1000 ( U 2) = 1000 0000 ( U 2 ) = 0111 1111( U 2) zakres liczb 16-bitowych w kodzie U2: − 215 = − 32 768(10) 215 − 1 = 32 767 (10) = 1000 0000 0000 0000 ( U 2 ) = 0111 1111 1111 1111( U 2) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 9/61 Kod U2 Zapis liczb 4-bitowych (1 bit - znak, 3 bity - moduł) w kodzie U2: Zwiększając obszar zajmowany przez liczbę w kodzie U2, dodawany obszar wypełnia się bitem znaku, np. zapis liczb na 4 bitach i 8 bitach: 5(10 ) = 0.101( U 2) 5(10 ) = 0.000 0101( U 2) − 5(10 ) = 1.011( U 2 ) − 5(10 ) = 1.111 1011( U 2) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 10/61 Zapis liczb 4-bitowych (1 bit - znak, 3 bity - moduł) w kodzie U2 źródło: B. Parhami - „Computer Arithmetic: Algorithms and Hardware Design” (2000) dr inż. Jarosław Forenc 11/61 Kod U2 Nazwa kodu (U2 - uzupełnień do dwóch) wzięła się ze sposobu obliczania liczb przeciwnych W przypadku liczby n-bitowej wartość przeciwną otrzymujemy odejmując liczbę od dwukrotnej wagi najstarszego bitu (2 · 2n-1 = 2n) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 Krok 1: inwersja (negacja) wszystkich bitów liczby, tj. zamiana 0 na 1 i 1 na 0 12/61 Przykłady zapisu liczb: zamieniamy liczbę dodatnią zamieniamy liczbę na NKB 93(10 ) = 1011101( NKB) dodajemy bit znaku: 0 powyższy zapis liczby dodatniej jest taki sam jak w kodzie U1 zamieniamy moduł liczby na NKB i dodajemy bit znaku − 93(10 ) = 93(10 ) = 0.1011101 93(10 ) = 0.1011101( U 2) zamieniamy liczbę ujemną − 93(10 ) = ?( U 2 ) 93(10 ) = ?( U 2) Krok 2: zwiększenie wyniku o 1 Uwaga: powyższym sposobem nie otrzymamy wartości przeciwnej np. 8-bitowej liczby 1000 0000(U2), gdyż ona po prostu nie istnieje dr inż. Jarosław Forenc Kod U2 Praktycznie stosuje się algorytm, składający się z dwóch kroków: dr inż. Jarosław Forenc Kod U2 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 negacja bitów 0.1011101 → 1.0100010 dodanie 1 − 93(10 ) = 1.0100011( U 2 ) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 13/61 Kod U2 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 14/61 Kod U2 Zamiana liczby na przeciwną: 75(10 ) → − 75(10 ) Zamiany liczby na przeciwną: − 75(10 ) = ?( U 2 ) − 75(10 ) → 75(10 ) − 75(10 ) = 10110101( U 2) 75(10 ) = ?( U 2 ) 75(10) = 01001011( U 2 ) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 15/61 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 16/61 Kod U2 Kod U2 dr inż. Jarosław Forenc Obliczenie wartości dziesiętnej liczby w kodzie U2: Liczba stałoprzecinkowa z częścią ułamkową w kodzie U2: 10110101( U 2 ) = ?(10 ) przedstawienie liczb 73,37(10) w kodzie U2 z dokładnością do trzech cyfr po przecinku bit znaku, 1 - liczba ujemna 10110101( U 2) = 1 ⋅ (−2 ) + 0 ⋅ 2 + 1 ⋅ 2 + 1 ⋅ 2 + 0 ⋅ 2 + 1 ⋅ 2 + 0 ⋅ 2 + 1 ⋅ 2 7 6 5 4 3 2 1 73,37 (10) = ?( NKB) 10110101( U 2 ) = −128 + 32 + 16 + 4 + 1 10110101( U 2 ) = −75(10) 01011100( U 2) = ?(10 ) bit znaku, 0 - liczba dodatnia 01011100 ( U 2) = 0 ⋅ (−27 ) + 1 ⋅ 2 6 + 0 ⋅ 25 + 1 ⋅ 2 4 + 1 ⋅ 23 + 1 ⋅ 2 2 + 0 ⋅ 21 + 0 ⋅ 2 0 01011100 ( U 2) = 64 + 16 + 8 + 4 01011100 ( U 2 ) = 92 (10) 73,37 ⋅ 23 = 586,96 ≈ 587 0 587 / 2 = 293 reszta 1 293 / 2 = 146 reszta 1 146 / 2 = 73 / 2 = 73 36 reszta 0 reszta 1 = = 18 9 reszta 0 reszta 0 36 / 2 18 / 2 zaokrąglamy do najbliższej wartości całkowitej 9 / 2 = 4 reszta 1 4 / 2 = 2 reszta 0 2 / 2 = 1 reszta 0 1/ 2 = 0 reszta 1 przecinek przed 3 ostatnimi cyframi 1001001011 stawiamy → 1001001,011( NKB) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 17/61 Kod U2 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 18/61 Reprezentacja liczb w systemach komputerowych Liczba stałoprzecinkowa z częścią ułamkową w kodzie U2: bit znaku 1001001,011 dodajemy → 0.1001001,011( U 2 ) 73,37 (10) = 0.1001001,011( U 2 ) otrzymaną liczbę zamieniamy na przeciwną, czyli szukamy -73,37(10) w kodzie U2 z dokładnością do trzech cyfr po przecinku NOT 1.0110110,100 0.1001001,011 +"1" 0.0000000,001 1.0110110,101 1.0110110,100 − 73,37 (10) = 1.0110110,101( U 2 ) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 19/61 Zapis zmiennoprzecinkowy liczby rzeczywistej Zapis bardzo dużych lub bardzo małych liczb w normalnej notacji pozycyjnej jest niewygodny gdyż wymaga dużej ilości cyfr, np. dwanaście bilionów: 12 000 000 000 000 trzydzieści trylionów: 30 000 000 000 000 000 000 jedna bilionowa: 0,000 000 000 001 Znacznie prostsze jest przedstawienie powyższych liczb w postaci zmiennoprzecinkowej (ang. floating point numbers) 12 000 000 000 000 = 1,2·1013 30 000 000 000 000 000 000 = 3,0·1019 0,000 000 000 001 = 1,0·10-12 Powyższy zapis nazywamy także zapisem w postaci wykładniczej lub też notacją naukową Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc Zapis zmiennoprzecinkowy liczby rzeczywistej Zapis liczby zmiennoprzecinkowej ma postać: L = M ⋅ BE gdzie: L M B E - wartość liczby mantysa podstawa systemu wykładnik, cecha Przykład: 2,43 ⋅103 (10) = 2,43 ⋅1000 = 2430 (10) 6,591⋅10 −2 (10) = 6,591 ⋅ 0,01 = 0,06591(10) 20/61 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 21/61 Zapis zmiennoprzecinkowy liczby rzeczywistej Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 1,011⋅10101( 2) = ?(10) Położenie przecinka w mantysie nie jest ustalone i może się zmieniać Poniższe zapisy oznaczają tę samą liczbę M = 1,011( 2 ) = 1 ⋅ 20 + 0 ⋅ 2 −1 + 1 ⋅ 2 − 2 + 1⋅ 2 −3 = 1 + 0,25 + 0,125 = 1,375(10) 243·101 = 24,3·102 = 2,43·103 = 0,243·104 B = 10( 2) = 0 ⋅ 2 0 + 1 ⋅ 21 = 2(10 ) E = 101( 2) = 1⋅ 2 0 + 0 ⋅ 21 + 1⋅ 2 2 = 1 + 4 = 5(10) 1,011⋅10101( 2) = 1,375 ⋅ 25 = 1,375 ⋅ 32 = 44(10) Dla ujednolicenia zapisu i usunięcia wielokrotnych reprezentacji tej samej liczby, przyjęto tzw. postać znormalizowaną zapisu liczby, w której mantysa spełnia nierówność: B > M ≥1 3,121 ⋅1032 ( 4 ) = ?(10) Przykład: M = 3,121( 4 ) = 3 ⋅ 4 0 + 1 ⋅ 4 −1 + 2 ⋅ 4 − 2 + 1⋅ 4 −3 = 3,390625(10) B = 10( 4) = 0 ⋅ 4 0 + 1 ⋅ 41 = 4(10) 2,43·103 - to jest postać znormalizowana, gdyż: 10 > | 2,43 | ≥ 1 E = 32( 4 ) = 2 ⋅ 4 + 3 ⋅ 4 = 2 + 12 = 14(10 ) 0,243·104 - to nie jest postać znormalizowana 3,121 ⋅10 24,3·102 - to nie jest postać znormalizowana 0 32 ( 4) 1 = 3,390625 ⋅ 4 = 910 163 968(10) 14 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 23/61 Zapis zmiennoprzecinkowy liczby rzeczywistej Jak zapisać liczbę w postaci zmiennoprzecinkowej? Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 1523,169(10) W arytmetyce zmiennoprzecinkowej kolejność wykonywania operacji ma wpływ na końcowy wynik Arytmetyka zmiennoprzecinkowa nie jest łączna: ( x + y) + z ≠ x + ( y + z ) zapisujemy mantysę przy wykładniku równym zero ( x ⋅ y) ⋅ z ≠ x ⋅ ( y ⋅ z ) 1523,169 ⋅100 (10) normalizujemy mantysę modyfikując wykładnik liczby dodatkowo może nastąpić obcięcie (ang. truncate) albo zaokrąglenie (ang. round) mantysy do zadanej ilości cyfr - obcięcie: 1,5231 ⋅103(10) Arytmetyka zmiennoprzecinkowa nie jest rozdzielna: x ⋅ ( y + z ) ≠ ( x ⋅ y) + ( x ⋅ z ) 1,523169 ⋅103(10) - zaokrąglenie: 1,5232 ⋅103 (10) dr inż. Jarosław Forenc Arytmetyka liczb zmiennoprzecinkowych Przykład: 22/61 Zapis zmiennoprzecinkowy liczby rzeczywistej Przykład: dr inż. Jarosław Forenc 24/61 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 25/61 Arytmetyka liczb zmiennoprzecinkowych Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 26/61 Arytmetyka liczb zmiennoprzecinkowych Dodawanie i odejmowanie: dodawanie i odejmowanie liczb zmiennoprzecinkowych wymaga sprowadzenia ich do wspólnego wykładnika (wyrównanie wykładników liczb zmiennoprzecinkowych lub denormalizacja) denormalizacja dotyczy liczby o mniejszym wykładniku tak, aby sprowadzić obie liczby do wspólnego większego wykładnika Dodawanie i odejmowanie: jeśli wykładnik pierwszej liczby jest większy od wykładnika drugiej liczby (E1 > E2), to sumę (różnicę) liczb wyznaczamy ze wzoru: L1 ± L 2 = M1 ⋅ BE ± M 2 ⋅ BE 1 załóżmy, że mamy dwie liczby zmiennoprzecinkowe: L1 = M1 ⋅ B L2 = M 2 ⋅ B E1 L1 ± L 2 = ( M1 ± M 2 ⋅ BE jeśli wykładniki obu liczb są sobie równe (E1 = E2 = E), to normalizacji nie trzeba przeprowadzać mantysa sumy (różnicy) liczb jest sumą (różnicą) mantys liczb, zaś wykładnik sumy (różnicy) jest równy wykładnikowi dodawanych (odejmowanych) liczb: Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 jeśli wykładnik drugiej liczby jest większy od wykładnika pierwszej liczby (E2 > E1), to sumę (różnicę) liczb wyznaczamy ze wzoru: 1 Przykład - dodawanie: B ± M 2 ⋅ BE BE L1 ± L 2 = ( M1 ⋅ BE − E ± M 2 ) ⋅ BE 1 L1 + L 2 = (M1 ⋅ B 28/61 obliczamy różnicę dwóch liczb zmiennoprzecinkowych: L1 = M1 ⋅ BE = 3,5 ⋅103 1 L 2 = M 2 ⋅ B = 2,5 ⋅101 E2 + M2 ) ⋅ B ponieważ E1 > E2, to stosujemy wzór: L1 − L 2 = (M1 − M 2 ⋅ BE E2 obliczenia: L1 + L 2 = 1,5 ⋅101 + 2,5 ⋅103 2 − E1 ) ⋅ BE 1 obliczenia: L1 − L 2 = 3,5 ⋅103 − 2,5 ⋅101 L1 + L 2 = (1,5 ⋅101−3 + 2,5) ⋅103 L1 − L 2 = (3,5 − 2,5 ⋅101−3 ) ⋅103 L1 + L 2 = (1,5 ⋅10 + 2,5) ⋅10 L1 − L 2 = (3,5 − 2,5 ⋅10 −2 ) ⋅103 −2 3 L1 + L 2 = (0,015 + 2,5) ⋅103 = 2,515 ⋅103 dr inż. Jarosław Forenc Przykład - odejmowanie: 3 ponieważ E1 < E2, to stosujemy wzór: E1 − E 2 2 Arytmetyka liczb zmiennoprzecinkowych L1 = M1 ⋅ B = 1,5 ⋅10 L 2 = M 2 ⋅ B = 2,5 ⋅10 2 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 1 E2 2 2 1 obliczamy sumę dwóch liczb zmiennoprzecinkowych: 2 E2 L1 ± L 2 = M1 ⋅ BE 27/61 E1 1 1 L1 ± L 2 = M1 ⋅ BE ± M 2 ⋅ BE dr inż. Jarosław Forenc Arytmetyka liczb zmiennoprzecinkowych 2 − E1 1 2 E2 L1 ± L 2 = M1 ⋅ B E1 ± M 2 ⋅ BE 2 = (M1 ± M 2 ) ⋅ B E BE BE ) ⋅ BE L1 ± L 2 = M1 ⋅ BE ± M 2 ⋅ BE 1 2 otrzymany wynik jest w postaci znormalizowanej L1 − L 2 = (3,5 − 0,025) ⋅103 = 3,475 ⋅103 otrzymany wynik jest w postaci znormalizowanej Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 29/61 Arytmetyka liczb zmiennoprzecinkowych iloczyn liczb L1 i L2 ma postać: L1 = M1 ⋅ BE = 1,6 ⋅103 , obliczamy iloraz dwóch liczb zmiennoprzecinkowych: L1 = M1 ⋅ BE = 1,6 ⋅103 , mantysa ilorazu jest ilorazem mantys, zaś wykładnik ilorazu jest różnicą wykładników po wykonaniu dzielenia mantysa wyniku jest normalizowana L1 / L 2 = (M1 / M 2 ) ⋅ BE −E = 1,6 / 2,3 ⋅103+1 = 0,69565 ⋅104 1 dr inż. Jarosław Forenc 31/61 Z powyższego powodu liczba w zapisie zmiennoprzecinkowym jest określona z pewną dokładnością i może występować tylko w określonym zakresie Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 8 7 31 wykładnik 32/61 24 23 16 15 8 7 0 S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM znak wykładnik mantysa Wartość liczby obliczana jest ze wzoru: L = (−1)S ⋅ M ⋅ BE gdzie: 0 L S M B E S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM znak dr inż. Jarosław Forenc Liczby zmiennoprzecinkowe w systemie binarnym Zakodowana liczba zmiennoprzecinkowa ma postać: 16 15 2 normalizacja wyniku: L1 / L 2 = 0,69565 ⋅10 4 = 6,9565 ⋅103 W praktycznych realizacjach zapisu liczb zmiennoprzecinkowych przyjmuje się ograniczony zakres na mantysę i cechę 24 23 2 obliczenia: 31 L 2 = M 2 ⋅ BE = 2,3 ⋅10 −1 1 Liczby zmiennoprzecinkowe w systemie binarnym Przykład - dzielenie: E1 − E 2 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 2 otrzymany wynik jest w postaci znormalizowanej iloraz liczb L1 i L2 ma postać: L1 / L 2 = (M1 / M 2 ) ⋅ B 1 2 obliczenia: L1 ⋅ L 2 = M1 ⋅ M 2 ⋅ BE + E = 1,6 ⋅ 2,3 ⋅103−1 = 3,68 ⋅102 Dzielenie: L 2 = M 2 ⋅ BE = 2,3 ⋅10 −1 1 po wykonaniu mnożenia mantysa wyniku jest normalizowana obliczamy iloczyn dwóch liczb zmiennoprzecinkowych: E1 + E 2 mantysa iloczynu jest iloczynem mantys, zaś wykładnik iloczynu jest sumą wykładników 30/61 Przykład - mnożenie: L1 ⋅ L 2 = (M1 ⋅ M 2 ) ⋅ B dr inż. Jarosław Forenc Arytmetyka liczb zmiennoprzecinkowych Mnożenie: Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 mantysa - wartość liczby znak liczby (ang. sign), przyjmuje wartość 0 lub 1 znormalizowana mantysa (ang. mantissa), liczba ułamkowa podstawa systemu liczbowego (ang. base) wykładnik (ang. exponent), cecha, liczba całkowita W systemie binarnym podstawa systemu jest stała: B = 2 L = (−1)S ⋅ M ⋅ 2 E Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 33/61 Zakres liczb zmiennoprzecinkowych dr inż. Jarosław Forenc 34/61 Zakres liczb zmiennoprzecinkowych Załóżmy, że liczba składa się z: Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 m - cyfr mantysy n+1 - cyfr wykładnika (n - cyfr wartości i 1 cyfry znaku) 1 - cyfry znaku całej liczby W takim przypadku najmniejsza i największa wartość możliwa do zapisania w tej reprezentacji wynoszą: x min = M min ⋅ BE min = 1 ⋅ BE min x max = M max ⋅ BE max = (B − B−( m −1) ) ⋅ BE max Zakres liczb, które mogą być reprezentowane w danym zapisie: − x max ,− x min ∪ { 0 } ∪ x min , x max Wartości minimalne i maksymalne: wykładnik: E min = −Bn + 1 E max = Bn − 1 mantysa: M min = 1 M max = B − B−( m −1) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 35/61 Zakres liczb zmiennoprzecinkowych Nie wszystkie liczby rzeczywiste można przedstawić za pomocą zapisu zmiennoprzecinkowego xmin - najmniejsza wartość możliwa do zapisania w danej reprezentacji xmax - największa wartość możliwa do zapisania w danej reprezentacji Niedomiar występuje, gdy wielkość ułamkowa jest zbyt mała zazwyczaj jest wtedy aproksymowana przez zero Nadmiar występuje, gdy wynik operacji zmiennoprzecinkowej jest większy od xmax lub mniejszy od -xmax Zero jest wartością specjalną, która nie jest bezpośrednio reprezentowana w tym zapisie Zazwyczaj istnieją także inne wartości specjalne, które są reprezentowane w inny sposób, np. +∞, -∞ Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 36/61 Zakres liczb zmiennoprzecinkowych Liczby reprezentowane w notacji zmiennoprzecinkowej nie są rozmieszczone równomiernie na osi liczb jak liczby stałopozycyjne Możliwe wartości są rozłożone gęściej na początku osi, a rzadziej w miarę oddalania się od początku Wiele wyników obliczeń musi być zatem zaokrąglana do najbliższych wartości możliwych do reprezentowania Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 37/61 Przesunięcie wykładnika W celu uniknięcia kodowania znaku wykładnika jest on zapisywany jako wartość przesunięta o pewną stałą (ang. biased exponent) zapis wykładnika z nadmiarem, z przesuniętym wykładnikiem Właściwą wartość wykładnika otrzymuje się poprzez odjęcie od zakodowanego wykładnika wartości przesunięcia (ang. bias) Wartość liczby zmiennoprzecinkowej oblicza się zatem ze wzoru: L - wartość liczby E - wykładnik Standard opracowany w celu ujednolicenia operacji na liczbach zmiennoprzecinkowych na różnych platformach sprzętowych IEEE Std. 754-1985 - IEEE Standard for Binary Floating-Point Arithmetic IEEE Std. 854-1987 - IEEE Standard for Radix-Independent Floating-Point Arithmetic S - znak liczby M - mantysa BIAS - przesunięcie (nadmiar) Typowe wartości przesunięcia wynoszą: standard niezależny od bazy obejmuje arytmetykę dwójkową i dziesiętną nie precyzuje dokładnie przyporządkowania poszczególnych bitów ani sposobu kodowania liczb zmiennoprzecinkowych IEEE Std. 754-2008 - IEEE Standard for Floating-Point Arithmetic dla formatu 32-bitowego: 27-1 = 127(10) = 7F(16) dla formatu 64-bitowego: 210-1 = 1023(10) = 3FF(16) najnowsza wersja standardu dla formatu 80-bitowego: 214-1 = 16383(10) = 3FFF(16) zawiera IEEE Std. 754-1985 i IEEE Std. 854-1987 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 39/61 Standard IEEE 754 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 40/61 Standard IEEE 754 Obecnie praktycznie wszystkie implementacje sprzętowe liczb zmiennoprzecinkowych oparte są o standard IEEE 754 Standard wymaga, aby liczba była przechowywana na trzech polach bitowych: 38/61 L = (−1)S ⋅ M ⋅ 2 E − BIAS gdzie: dr inż. Jarosław Forenc Standard IEEE 754 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 znaku (S) mantysy (M) przesuniętego wykładnika (E) W takim przypadku wartość liczby wyznaczana jest ze wzoru: L = ( −1) ⋅ M ⋅ 2 S E − BIAS Standard definiuje następujące klasy liczb zmiennoprzecinkowych: Wykładnik Długość słowa [bity] Znak [bity] Pojedyncza (ang. single) 32 Pojedyncza rozszerzona (ang. single extended) Precyzja Mantysa Długość [bity] Zakres Długość [bity] Cyfry znaczące 1 8 2±127 ≈ 10±38 23 7 ≥ 43 1 ≥ 11 ≥ 2±1023 ≈ 10±308 ≥ 31 ≥ 10 Podwójna (ang. double) 64 1 11 2±1023 ≈ 10±308 52 16 Podwójna rozszerzona (ang. double extended) ≥ 79 1 ≥ 15 ≥ 2±16383 ≈ 10±4932 ≥ 63 ≥ 19 źródło: Gryś S.: „Arytmetyka komputerów w praktyce”. PWN, Warszawa, 2007 (str. 116). Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 41/61 Standard IEEE 754 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 42/61 Standard IEEE 754 - precyzja liczb Liczba bitów wykładnika decyduje o zakresie liczb, które można wyrażać w danym formacie Liczba bitów mantysy decyduje o precyzji liczb standard podaje jedynie minimalną liczbę bitów pozostawiając szczegóły implementacji producentom procesorów i kompilatorów Jako precyzję należy rozumieć liczbę zapamiętywanych cyfr znaczących w systemie dziesiętnym Bardzo popularny jest 80-bitowy format podwójnej rozszerzonej precyzji wprowadzony przez firmę Intel W systemie o podstawie p używając n cyfr można wyrazić pn różnych wartości W 80-bitowym formacie Intela: W celu określenia liczby bitów potrzebnych do zakodowania 1 cyfry dziesiętnej wystarczy rozwiązać równanie: W przypadku liczb: pojedynczej rozszerzonej precyzji (ang. single extended precision) podwójnej rozszerzonej precyzji (ang. double extended precision) długość słowa: 80 bitów znak: 1 bit 2±16383 ≈ wykładnik: 15 bitów (zakres: mantysa: 63+1 bit (cyfry znaczące: 19) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc Standard IEEE 754 - precyzja liczb 101 = 2 n 10±4932) Do wyznaczenia liczby cyfr dziesiętnych (d), które można zakodować na m bitach stosujemy prostą proporcję: 43/61 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 44/61 Standard IEEE 754 - precyzja liczb 1 cyfra dziesiętna - log2(10) bitów d cyfr dziesiętnych - m bitów stąd: → n = log 2 (10) m d= log 2 (10) Dla formatu pojedynczej precyzji: mantysa: 23 + 1 = 24 bity cyfry znaczące: 7 d= 24 24 = = 7,2247 ≈ 7 log 2 (10) 3,321928 Dla formatu podwójnej precyzji: mantysa: 52 + 1 = 53 bity cyfry znaczące: 16 d= 53 53 = = 15,9546 ≈ 16 log 2 (10) 3,321928 Dla formatu podwójnej rozszerzonej precyzji: mantysa: 63 + 1 = 64 bity cyfry znaczące: 19 d= 64 64 = = 19,2659 ≈ 19 log 2 (10) 3,321928 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 45/61 Standard IEEE 754 - precyzja liczb #include <stdio.h> int main() { float x; double y; Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 float -> 1234567936.000000 double -> 1234567890.000000 /* 1.234.567.890 */ /* 1.234.567.890 */ %f\n",x); %f\n\n",y); y = 12345678901234567890.0; printf("double -> %f\n",y); return 0; } Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 47/61 Standard IEEE 754 - liczby 3232-bitowe 16-bitowy format całkowity (ang. short integer) 32-bitowy format całkowity (ang. integer) 64-bitowy format całkowity (ang. extended integer) 80-bitowy format dziesiętny BCD (kodowanie 18-cyfrowej liczby całkowitej dziesiętnej oraz znaku na najbardziej znaczącej pozycji) 24 23 16 15 8 7 wykładnik (8 bitów) Standard IEEE 754 definiuje nie tylko sposób reprezentacji liczb, ale także: sposób reprezentacji specjalnych wartości, np. nieskończoności, zera sposób wykonywania działań na liczbach zmiennoprzecinkowych sposób zaokrąglania liczb Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 0 dr inż. Jarosław Forenc 48/61 Pierwszy bit w zapisie (bit nr 31) jest bitem znaku (0 - liczba dodatnia, 1 - liczba ujemna) Wykładnik zapisywany jest na 8 bitach (bity nr 30-23) z nadmiarem (przesunięciem wykładnika) o wartości 127 Wykładnik może przyjmować wartości od -127 (wszystkie bity wyzerowane) do 128 (wszystkie bity ustawione na 1) 24 23 16 15 8 7 0 S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM mantysa (23 bity) Liczba pojedynczej precyzji przechowywana jest na 32 bitach: 31 S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM znak Standard IEEE 754 definiuje także trzy formaty stałoprzecinkowe dwójkowe i jeden stałoprzecinkowy format dziesiętny BCD: Standard IEEE 754 - liczby 3232-bitowe Liczba pojedynczej precyzji przechowywana jest na 32 bitach: 31 46/61 Standard IEEE 754 double -> 12345678901234567000.000000 x = 1234567890.0; y = 1234567890.0; printf("float -> printf("double -> dr inż. Jarosław Forenc znak wykładnik (8 bitów) mantysa (23 bity) Mantysa zapisywana jest na 23 bitach w kodzie U1 W większości przypadków mantysa jest znormalizowana Wartość mantysy zawiera się pomiędzy 1 a 2, a zatem w zapisie liczby pierwszy bit jest zawsze równy 1 Powyższy bit nie jest zapamiętywany, natomiast jest automatycznie uwzględniany podczas wykonywania obliczeń Dzięki pominięciu tego bitu zyskujemy dodatkowy bit mantysy (zamiast 23 bitów mamy 24 bity) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 49/61 Standard IEEE 754 - liczby 3232-bitowe obliczmy wartość dziesiętną liczby zmiennoprzecinkowej 0{ = 1⋅ 20 + 1⋅ 2 −1 + 1⋅ 2 − 4 = 1 + 0,5 + 0,0625 = 1,5625(10) 10000101 0000000000 1424 3 1001000000 144444 24444000 4 3 E − wykladnik M − mantysa ( tylko czesc ulamkowa ) L = (−1)S ⋅ M ⋅ 2 E L = (−1) ⋅1,5625 ⋅ 2 = 100(10 ) dr inż. Jarosław Forenc 51/61 Przykład: Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 obliczmy wartość dziesiętną liczby zmiennoprzecinkowej S − bit znaku M − mantysa ( tylko czesc ulamkowa ) M = 01,11010000000000000000000( U1) = wartość dziesiętną liczby zmiennoprzecinkowej obliczamy według wzoru: L = (−1)S ⋅ M ⋅ 2 E określamy znak liczby S = 1 − liczba ujemna wyznaczamy mantysę dopisując na początku 01 (0 - znak liczby w kodzie U1, 1 - część całkowita) i stawiając przecinek = 1⋅ 20 + 1⋅ 2 −1 + 1⋅ 2 −2 + 1⋅ 2 − 4 = 1 + 0,5 + 0,25 + 0,0625 = 1,8125(10 ) 10000111 0000000000 1424 3 1101000000 144444 24444000 4 3 E − wykladnik 52/61 Przykład (cd.): dzielimy liczbę na części 1{ dr inż. Jarosław Forenc Standard IEEE 754 - liczby 3232-bitowe 11000011111010000000000000000000( IEEE 754) = ?(10) M = 1,5625(10) 6 01000010110010000000000000000000( IEEE 754) = 100(10) Standard IEEE 754 - liczby 3232-bitowe E = 6(10) , 0 nadmiar Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 podstawiając otrzymujemy: S = 0, obliczamy wykładnik pamiętając, że w reprezentacji 32-bitowej nadmiar wynosi 127 E = 10000101( 2 ) = 128 + 4 + 1 = 133 − 127 { = 6(10) wartość dziesiętną liczby zmiennoprzecinkowej obliczamy według wzoru: określamy znak liczby S = 0 − liczba dodatnia wyznaczamy mantysę dopisując na początku 01 (0 - znak liczby w kodzie U1, 1 - część całkowita) i stawiając przecinek M = 01,10010000000000000000000( U1) = dzielimy liczbę na części S − bit znaku 50/61 Przykład (cd.): 01000010110010000000000000000000( IEEE 754) = ?(10) dr inż. Jarosław Forenc Standard IEEE 754 - liczby 3232-bitowe Przykład: Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 obliczamy wykładnik pamiętając, że w reprezentacji 32-bitowej nadmiar wynosi 127 E = 10000111( 2 ) = 128 + 4 + 2 + 1 = 135 − 127 { = 8(10 ) nadmiar podstawiając otrzymujemy: S = 1, E = 8(10) , M = 1,8125(10) L = (−1) ⋅1,8125 ⋅ 2 = −464(10) 1 8 11000011111010000000000000000000( IEEE 754) = −464(10 ) Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 53/61 Standard IEEE 754 - liczby 6464-bitowe Liczba podwójnej precyzji przechowywana jest na 64 bitach: Pierwszy bit w zapisie (bit nr 63) jest bitem znaku (0 - liczba dodatnia, 1 - liczba ujemna) Wykładnik zapisywany jest na 11 bitach (bity nr 62-52) z nadmiarem (przesunięciem wykładnika) o wartości 1024 Wykładnik może przyjmować wartości od -1023 (wszystkie bity wyzerowane) do 1024 (wszystkie bity ustawione na 1) Mantysa zapisywana jest na 52 bitach w kodzie U1 (pierwszy bit mantysy, zawsze równy 1, nie jest zapamiętywany) dr inż. Jarosław Forenc Standard IEEE 754 - kalkulator IEEE-754 Calculators - http://babbage.cs.qc.edu/IEEE-754/ dr inż. Jarosław Forenc 54/61 Standard IEEE 754 - kalkulator Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 55/61 IEEE-754 Calculators - http://babbage.cs.qc.edu/IEEE-754/ Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 56/61 Standard IEEE 754 - zakres liczb Pojedyncza precyzja: największa wartość: ≈ 3,4 ⋅ 1038 najmniejsza wartość: ≈ 1,4 ⋅ 10-45 zakres liczb: ... -1,4⋅10-45> ∪ {0} ∪ <1,4⋅10-45 ... 3,4⋅1038> <-3,4⋅1038 Podwójna precyzja: największa wartość: ≈ 1,8 ⋅ 10308 najmniejsza wartość: ≈ 4,9 ⋅ 10-324 zakres liczb: <-1,8⋅10308 ... -4,9⋅10-324> ∪ {0} ∪ <4,9⋅10-324 ... 1,8⋅10308> Podwójna rozszerzona precyzja: największa wartość: ≈ 1,2 ⋅ 104932 najmniejsza wartość: ≈ 3,6 ⋅ 10-4951 zakres liczb: <-1,2⋅104932 ... -3,6⋅10-4951> ∪ {0} ∪ <3,6⋅10-4951 ... 1,2⋅104932> Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 57/61 Standard IEEE 754 - wartości specjalne bit znaku może przyjmować dowolną wartość, a zatem można otrzymać zero dodatnie lub zero ujemne 0 0 0 0 znak Kodowanie wartości specjalnych jest możliwe dzięki zastosowaniu przesunięcia wykładnika - wartości graniczne (np. 00h i FFh) są zarezerwowane do kodowania wartości specjalnych znak NKB z przesunięciem: -1 7Eh +1 80h Z-M: -1 81h 0 00h/80h +1 01h U2: -1 FFh 0 00h ... 0 0 0 0 0 0 0 0 0 wykładnik 1 0 0 0 Zapis z przesunięciem wykładnika jest monotoniczny (czego nie ma w kodach Z-M i U2), np. ... 0 ... 0 0 0 0 0 0 - zero dodatnie mantysa 0 0 0 0 0 0 0 0 wykładnik ... 0 0 0 0 0 0 - zero ujemne mantysa wszystkie bity wykładnika i mantysy są równe zeru przy porównaniach zero dodatnie i ujemne są traktowane jako równe sobie +1 01h dr inż. Jarosław Forenc 59/61 Standard IEEE 754 - wartości specjalne Nieskończoność 58/61 Zero liczba zdenormalizowana nieliczby Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 zero nieskończoność 0 7Fh dr inż. Jarosław Forenc Standard IEEE 754 - wartości specjalne Oprócz zwykłych liczb w standardzie IEEE 754 zdefiniowano kilka wartości specjalnych: Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc 60/61 Standard IEEE 754 - wartości specjalne Liczba zdenormalizowana bit znaku określa czy mamy nieskończoność dodatnią czy ujemną 0 0 0 0 0 1 1 1 ... 1 1 1 0 0 0 0 0 0 ... 0 0 0 0 0 0 wykładnik wykładnik mantysa 1 0 0 0 1 1 1 1 znak ... 1 wykładnik 1 1 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 x x x x x x ... x x x x x x - nieskończoność dodatnia znak znak ... 0 - nieskończoność ujemna znak mantysa ... 0 wykładnik mantysa 0 0 x x x x x x ... x x x x x x mantysa wszystkie bity wykładnika są równe jeden, zaś wszystkie bity mantysy - zero bit znaku może być równy zero lub jeden, wszystkie bity wykładnika są równe zeru, zaś bity mantysy przyjmują dowolne wartości nieskończoność występuje w przypadku wystąpienia nadmiaru (przepełnienia) oraz przy dzieleniu przez zero pojawia się, gdy występuje niedomiar (ang. underflow), ale wynik operacji można jeszcze zapisać denormalizując mantysę w takim przypadku mantysa nie posiada domyślnej części całkowitej równej 1, tzn. reprezentuje liczbę o postaci 0,xxx…xxx, a nie 1,xxx…xxx Informatyka 1, studia niestacjonarne I stopnia Rok akademicki 2010/2011, Wykład nr 4 dr inż. Jarosław Forenc Koniec wykładu nr 4 Dziękuję za uwagę! 61/61