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

Podobne dokumenty