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 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) 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 Precyzja Długość słowa [bity] Znak S [bity] Wykładnik E Mantysa F Długość [bity] Zakres Dług. [bity] Dokł. przy podstawie 10 [cyfry znaczące] Pojedyncza (ang. single) 32 1 8 2±127≈10±38 23 7 Pojedyncza rozszerzona (ang. single extended) ≥43 ≥11 ≥2±1023≈10±308 ≥31 ≥10
Właściwości liczb znormalizowanych Precyzja Dług. słowa Znak S Wykładnik E Mantysa F Dług. [bity] Zakres Dług [bity] cyfry znaczące Podwójna (ang. double) 64 1 11 2±1023≈10±308 52 16 Podwójna rozszerzona (ang. double extended) ≥79 ≥15 ≥2±16383≈10±4932 ≥63 ≥19 Podwójna rozszerzona* (ang. double extended) 80 15 2±16383≈10±4932 63+1 19
Stosowane typy danych w językach programowania Format Znak [bity] Wykładnik [bity] Mantysa [bity] Szerokość słowa [bity] Typy w językach programowania IEEE-754 single 1 8 23 32 C, Java: float Pascal: single Fortran: real*4 IEEE-854 double 11 52 64 C, Java: doule Pascal: real Fortran: real*8
Wartości specjalne liczb zmiennoprzecinkowych Wartość specjalna Bit znaku Bity wykładnika Bity mantysy Uwagi NaN (not a number) x 111..111 xxxx...xxx wszystkie bity wykładnika są równe 1, natomiast mantysa ma niezerową wartość QNaN (quite not a number) x 111..111 1xxx...xxx uwagi jak dla NaN, ale pierwszy bit mantysy zawsze równy 1 SNaN (signaling not a number) x 111..111 0xxx...xxx uwagi jak dla NaN, ale pierwszy bit mantysy zawsze równy 0 Zero +0.0 000..000 000...000 wszystkie bity mantysy i wykładnika równe 0, znak równy 0 Zero -0.0 1 000..000 000...000 wszystkie bity mantysy i wykładnika równe 0, znak równy 1 Nieskończoność x 111..111 000...000000 wszystkie bity mantysy są równe 0, wszystkie bity wykładnika równe 1
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 1001 1001 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 1
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