160 likes | 390 Views
Architektura systemów komputerowych. Wykład 3 Reprezentacja danych część 3. dr inż. Wojciech Bieniecki Instytut Matematyki i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz. Zapis zmiennoprzecinkowy liczby rzeczywistej.
E N D
Architektura systemów komputerowych Wykład 3 Reprezentacja danych część 3 dr inż. Wojciech Bieniecki Instytut Matematyki i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz
Zapis zmiennoprzecinkowy liczby rzeczywistej Zapis bardzo dużych lub bardzo małych liczb w notacji pozycyjnej jest niewygodny, bo wymaga dużej ilości cyfr, np. dwanaście bilionów: 12 000 000000000 trzydzieści trylionów: 30 000 000000000000000 jedna bilionowa: 0,000 000 000 001 Znacznie prostsze jest przedstawienie powyższych liczb w postaci zmiennoprzecinkowej (ang. floating point numbers) 12000000000000 = 1,21013 30000000000000000000 = 3,01019 0,000000000001 = 1,010-12 Zapis zmiennoprzecinkowy to inaczej postać wykładnicza Jest użyteczny do wyrażania bardzo dużych liczb całkowitych lub małych ułamków, np.: Stałe fizyczne i chemiczne: 5.98*1024 kg masa Ziemi 6.02 *1023 mol-1 stała Avogadra (liczba cząstek materii w jednym molu substancji) Przelicznik jednostek 1 eV=1.6*10-19 J
Zapis zmiennoprzecinkowy Liczba w zapisie zmiennoprzecinkowym składa się z: L = s×f×pc s – znak liczby ( 1 lub -1) f – mantysa (liczba ułamkowa), p – podstawa systemu, c – wykładnik potęgowy, czyli cecha (liczba całkowita) znaku liczby (ang. sign) mantysy (ang. fraction), czyli liczby, kto rej wartość bezwzględna jest mniejsza od wartości podstawy systemu pozycyjnego (dokładność ) podstawy podniesionej do pewnej potęgi zwanej wykładnikiem lub cechą (zakres) (ang. exponent) W ogólności położenie przecinka w mantysie nie jest ustalone i może się dowolnie zmieniać . Poniższe zapisy oznaczają tę samą liczbę : 325×1020 = 32,5×1021 = 3,25×1022 = 0,0325×1024 Zmiana położenia przecinka w mantysie wpływa na wartość cechy liczby Przesunięcie przecinka o 1 pozycję w lewo wymaga zwiększenia cechy o 1. Przesunięcie przecinka o 1 pozycję w prawo wymaga zmniejszenia cechy o 1.
Znormalizowana liczba zmiennoprzecinkowa Ponieważ liczbę zmiennoprzecinkową można zapisywać w rożny sposób, przyjęto tzw. postać znormalizowaną . Znormalizowana liczba zmiennoprzecinkowa to taka, w której mantysa spełnia nierówność: p > | f | ≥1 Według tej definicji postacią znormalizowaną dla zapisów: 325×1020 = 32,5×1021 = 3,25×1022 = 0,0325×1024 jest zapis 3,25×1022 Jak zapisać liczbę, np. 1523,169(10)? zapisujemy mantysę przy wykładniku równym zero 1523,169×100(10) normalizujemy mantysę modyfikując wykładnik liczby 1,523169×103(10) dodatkowo może nastąpić obcięcie albo zaokrąglenie mantysy do zadanej ilości cyfr, np.: 1,5232×103(10) lub 1,5231×103(10)
Zmiennoprzecinkowe liczby binarne • Liczby są kodowane w jednym słowie maszyny podzielonym na trzy części: • znak liczby (zwykle 1 bit) • kod mantysy liczby i jej znak • kod cechy liczby i jej znak. L = (-1)s × f × 2c-bias s – bit znaku ( 0 oznacza znak +, 1 znak - ) f – znormalizowana mantysa c – wykładnik potęgi, czyli informacja o ile miejsc przesuwamy przecinek; może być dodatnia lub ujemna; jest zapisana w kodzie binarnym przesuniętym (bias to środek przedziału). W praktycznych realizacjach zapisu liczb zmiennoprzecinkowych przyjmuje się ograniczony zakres na mantysę i cechę Reprezentacja jest znormalizowana, tzn. bity mantysy są przesunięte tak, aby pierwsze miejsce po przecinku zajmował pierwszy znak 1 ciągu mantysy. (0,5)10 ≤ |f| < 1
Właściwości liczb znormalizowanych w formacie zmiennopozycyjnym wg IEEE P754
Sytuacje generujące wyjątki i wartości specjalne • Wyjątki (ang. exception) generujące QNaN zgodnie z IEEE 754 i Intel x87: • • niewłaściwa operacja arytmetyczna: • nadmiar/niedomiar stosu (stos poza R7 lub R0 – niebezpieczeństwo nadpisania danych), • operacja, której argumentem jest SNaN, • dodawanie lub odejmowanie typu (+∞)+(-∞), • mnożenie lub dzielenie: 0*∞, 0/0, ∞/∞, • reszta z dzielenia x/y, gdy x=∞ lub y=0, • pierwiastek kwadratowy z x, gdy x<0; • niemożność konwersji liczby z formatu zmiennopozycyjnego do całkowitego lub BCD, • niemożność porównania dwóch liczb, gdy co najmniej jedna z nich jest typu NaN, • • dzielenie przez zero (zwraca ∞), • • nadmiar numeryczny (liczba za duża), • • niedomiar numeryczny (liczba za mała), • • przybliżony rezultat operacji (wystąpiło zaokrąglenie lub obcięcie wyniku), • • zdenormalizowany operand (operand nie jest prawidłową liczbą typu single lub double).
Arytmetyka liczb zmiennoprzecinkowych – tworzenie Zapisz liczbę -20.1(10) w formacie float 1. Znajdujemy zapis binarny modułu naszej liczby. Jeśli nie jest to możliwe, ograniczmy się do 23 bitów 20(10) = 0001 0100(2) 0.1(10) ≈ 0. 0001 1001 1001 1001 101(2) 20.1(10) ≈ 0001 0100.0001 1001 1001 1001 101(2) 2. Formę znormalizowaną osiągniemy poprzez zmianę wykładnika tak, by kropka binarna znajdowała się po prawej stronie jedynki na najbardziej znaczącej pozycji. 20.1(10) ≈ 1.0100 0001 1001 1001 1001 101(2)×24 3. Z tego wynika, że cecha E = 24
Arytmetyka liczb zmiennoprzecinkowych - tworzenie 4. Wystarczy, że dla cech będziemy pamiętać to, co jest po przecinku F = 0100 0001 1001 10011001 101(2) 5. Dla formatu float wartość bias == 127, więc w kodzie przesuniętym będzie to 131 E = 4(10) = 10000011(bias127) 6. Cała liczba jest ujemna, więc pierwszy bit będzie 1 S = 1 Ostatecznie otrzymujemy
Arytmetyka liczb zmiennoprzecinkowych - zakresy Zakres wykładnika dla n bitów: Wykładnik jest w kodzie U2, więc zakres obliczamy tak samo: Emin = − Bn-1+ 1 Emax = Bn-1 − 1 Zakres mantysy dla m bitów: Pamiętamy, że dla znormalizowanej postaci nie musimy pamiętać tego co jest przed kropką, bo zawsze jest to 1 Fmin= 1 Fmax =1 + (1 − 2-m) Dla przykładu float: m=23, n=8 Emin = − 128 Emax = 127 Fmin= 1 Fmax = 1.9999999403953552 Lmin = − 2127*1.9999999403953552 ≈ − 2128 ≈ 3.4*1038 Lmax = 2127*1.9999999403953552 ≈ 2128 Qmin = 2−128*1 ≈ 2.93*10−39
Arytmetyka liczb zmiennoprzecinkowych - dodawanie Dla E1<E2 Przykład: wykonaj działanie 10.5 – 0.625 Wykonamy działanie: -0.625 + 10.5 |x1|=0.625 =0.101(2)=1.01(2) × 2-1 E1 = -1 = 11111111(2) F1 = 1.01 E2-E1=E2+(-E1) = 00000011 + 00000001= 00000100(U2) =4 x2=10.5 =1010.1(2)=1.0101(2) × 23 E2=3 = 00000011(2) F2=1.0101
Arytmetyka liczb zmiennoprzecinkowych - dodawanie F2*2E2-E1= 1.0101 * 24 = 10101(2) F2*2E2-E1 -F1 = 10101.00(2)- 00001.01(2)= 10010.11(2). x1-x2 = 10011.11(2)*2-1=1001.111(2)= 9.875
Arytmetyka liczb zmiennoprzecinkowych – mnożenie i dzielenie Wykonaj mnożenie 10.5 * 0.625 x1=0.625 = 1.01(2) × 2-1 x2= 1.0101(2) × 23 E1 = -1 = 11111111(2) F1 = 1.01 E2=3 = 00000011(2) F2=1.0101 F1*F2= 0.010101 +1.010100 =1.101001 E1+E2= 11111111 +00000011 =00000010 x1*x2=1.101001(2)*22=110.1001(2) = 6.5625