E 1 - Wojciech Bieniecki

Download Report

Transcript E 1 - Wojciech Bieniecki

Architektura systemów komputerowych jesień 2014 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,2  10 13 30000000000000000000 = 3,0  10 19 0,000000000001 = 1,0  10 -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*10 24 kg masa Ziemi 6.02 *10 23 mol -1 stała Avogadra (liczba cząstek materii w jednym molu substancji) Przelicznik jednostek 1 eV=1.6*10 -19 J 2

Zapis zmiennoprzecinkowy

Liczba w zapisie zmiennoprzecinkowym składa się z: 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)

L = s×f×p c

s – znak liczby ( 1 lub -1) f – mantysa (liczba ułamkowa), p – podstawa systemu, c – wykładnik potęgowy, czyli cecha (liczba całkowita) 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

×

10 20 = 32,5

×

10 21 = 3,25

×

10 22 = 0,0325

×

10 24 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.

3

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

×

10 20 = 32,5

×

10 21 = 3,25

×

10 22 = 0,0325

×

10 24 jest zapis 3,25

×

10 22 Jak zapisać liczbę, np. 1523,169 (10) ?

zapisujemy mantysę przy wykładniku równym zero 1523,169×10

0 (10)

normalizujemy mantysę modyfikując wykładnik liczby 1,523169×10

3 (10)

dodatkowo może nastąpić obcięcie albo zaokrąglenie mantysy do zadanej ilości cyfr, np.: 1,5232×10

3 (10)

lub 1,5231×10

3(10)

4

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

× 2

c-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 5

Właściwości liczb znormalizowanych w formacie zmiennopozycyjnym wg IEEE P754

Precyzja Długość słowa [bity] Znak S [bity] Pojedyncza (ang. single) Pojedyncza rozszerzona (ang. single extended) 32 ≥43 1 1 Wykładnik E Długość [bity] Zakres 8 2 ± 127 ≈10 ± 38 ≥11 ≥2 ± 1023 ≈10 ± 308 Dług.

[bity] Mantysa F Dokł. przy podstawie 10 [cyfry znaczące] 23 7 ≥31 ≥10 6

Właściwości liczb znormalizowanych

Precyzja Podwójna (ang. double) Podwójna rozszerzona (ang. double extended) Podwójna rozszerzona * (ang. double extended) Dług. słowa 64 Znak S Dług.

[bity] 1 11 ≥79 80 1 1 ≥15 15 Wykładnik E ≥2 2 2 ± ± ± Zakres 1023 16383 16383 ≈10 ≈10 ≈10 ± ± 308 ± 4932 4932 Mantysa F Dług [bity] 52 cyfry znaczące 16 ≥63 ≥19 63+1 19 7

Stosowane typy danych w językach programowania

Format

IEEE-754 single IEEE-854 double

Znak [bity] Wykładnik [bity] Mantysa [bity]

1 1 8 11 23 52

Szerokość słowa [bity]

32 64

Typy w językach programowania

C, Java: float Pascal: single Fortran: real*4 C, Java: doule Pascal: real Fortran: real*8 8

Wartości specjalne liczb zmiennoprzecinkowych

Wartość specjalna

NaN (not a number) QNaN (quite not a number) SNaN (signaling not a number) Zero +0.0

Bit znaku Bity wykładnika

x x x 0 111..111

111..111

111..111

000..000

Zero -0.0

Nieskończoność 1 x 000..000

111..111

Bity mantysy Uwagi

xxxx...xxx

1xxx...xxx

0xxx...xxx

000...000

000...000

000...000000

wszystkie bity wykładnika są równe 1, natomiast mantysa ma niezerową wartość uwagi jak dla NaN, ale pierwszy bit mantysy zawsze równy 1 uwagi jak dla NaN, ale pierwszy bit mantysy zawsze równy 0 wszystkie bity mantysy i wykładnika równe 0, znak równy 0 wszystkie bity mantysy i wykładnika równe 0, znak równy 1 wszystkie bity mantysy są równe 0, wszystkie bity wykładnika równe 1 9

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).

10

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) ×2 4 3. Z tego wynika, że cecha E = 2 4 11

Arytmetyka liczb zmiennoprzecinkowych - tworzenie

4. Wystarczy, że dla mantysy 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 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 12

Arytmetyka liczb zmiennoprzecinkowych - zakresy

Zakres wykładnika dla n bitów: Wykładnik jest w kodzie U2, więc zakres obliczamy tak samo:

E min E max

= − =

B n B n

-1 -1 − 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

F min F max

= 1 =1 + (1 − 2

-m

) Dla przykładu float: m=23, n=8

E min E max

= − 128 = 127

F min F max

= 1 = 1.9999999403953552

L L min max Q min

= − 2 127 *1.9999999403953552 ≈ − 2 128 = 2 127 *1.9999999403953552 ≈ 2 128 = 2 −128 *1 ≈ 2.93*10 −39 ≈ 3.4*10 38 13

Arytmetyka liczb zmiennoprzecinkowych - dodawanie

x

1 

F

1  2

E

1

x

2 

F

2  2

E

2

x

1 

x

2  

F

1 

F

2  2

E

2 

E

1   2

E

1 Dla E

1

Przykład: wykonaj działanie 10.5 – 0.625

Wykonamy działanie: -0.625 + 10.5

|x 1 |=0.625 =0.101

(2) =1.01

(2) × 2 -1 E 1 F 1 = -1 = 11111111 (U2) = 1.01

x 2 =10.5 =1010.1

(2) =1.0101

(2) × 2 3 E 2 =3 = 00000011 (U2) F 2 =1.0101

E 2 -E 1 =E 2 +(-E 1 ) = 00000011 + 00000001= 00000100 (U2) =4 14

Arytmetyka liczb zmiennoprzecinkowych - dodawanie

F 2 *2 E2-E1 = 1.0101 * 2 4 F 2 *2 E2-E1 -F 1 = 10101 = 10101.00

(2) (2) 00001.01

(2) = 10010.11

(2) .

x 1 -x 2 = 10011.11

(2)* 2 -1 =1001.111

(2) = 9.875

15

Arytmetyka liczb zmiennoprzecinkowych – mnożenie i dzielenie

x

1 

x

2  (

F

1 

F

2 )  2

E

1 

E

2

x

1 /

x

2  (

F

1 /

F

2 )  2

E

1 

E

2 Wykonaj mnożenie 10.5 * 0.625

x 1 =0.625 = 1.01

(2) × 2 -1 x 2 = 1.0101

(2) × 2 3 E 1 F 1 = -1 = 11111111 (U2) = 1.01

E 2 =3 = 00000011 (U2) F 2 =1.0101

F 1 *F 2 = 0.010101

+1.010100

=1.101001

E 1 +E 2 = 11111111 +00000011 =00000010

x 1 *x 2 =1.101001

(2) *2 2 =110.1001

(2) = 6.5625 16