Liczby zmiennoprzecinkowe

Transkrypt

Liczby zmiennoprzecinkowe
ARCHITEKTURA KOMPUTERÓW
17.11.2010
Liczby zmiennoprzecinkowe
Sprawa bardzo podobna jak w systemie dziesiętnym po przecinku mamy kolejno 10-tki do
ujemnych potęg, a w systemie binarnym mamy 2-ki w ujemnych potęgach.
Przykład dziesiętny:
Liczba dziesiętna
Kolejne potęgi
Kolejne ułamki
9
5


2
,
1
3
2
1



3⋅10
−1
−2
2⋅10
1⋅10
−3
10
5⋅10





90
5
0,3
0,02
0,001
Przykład binarny:
Liczba binarna
0
,

Kolejne potęgi
Kolejne ułamki
1
1

1
1

−1

−2
−3
1
1


−4
1⋅2−5
0⋅2
1⋅2
1⋅2
1⋅2
1⋅2






0
0,5
0,25
0,125
0,0625
0,03125
Przekształcenie liczby zmiennoprzecinkowej dziesiętnej do liczby binarnej
Podobnie jak w przekształceniu zwykłej liczby dziesiętnej na binarną z tą różnicą, że należy
mnożyć liczbę i jeśli przekroczy wartość 1 to w słupku z prawej wpisujemy 1, a w słupku z lewej
liczbę pomnożoną z odjętą 1-ką, a w przypadku nieprzekroczenia 1-ki w słupku po prawej piszemy
zero, a po lewej wymnożoną liczbę.
I tak aż otrzymamy w wyniku mnożenia 1,0 wtedy z prawej wstawiamy 1 i kończymy mnożenie.
Ale liczby zmiennoprzecinkowe dziesiętne nie odpowiadają idealnie liczbą zmiennoprzecinkowym
binarnym, czyli możemy sobie mnożyć i mnożyć w nieskończoność i nigdy nie uzyskamy 1,0 ale
jest na to metoda.
0,05 0
0,1 0
0,2 0
0,4 0
0,8 1
0,6 1
0,2
Jak widzimy na przykładzie mnożymy aż liczba zaczyna się zapętlać w tym przypadku liczba 0,2,
wtedy mamy liczbę w okresie czyli liczby w tym przypadku 0,2 do 0,6 gdyż mnożąc dalej
będziemy mieć te same liczby. W tym przypadku w okresie będzie wartość 0011. Licząc tą metodą
otrzymamy tylko wartość po przecinku więc musimy dodatkowo przeliczyć liczbę przed
przecinkiem w tym przypadku 0. Wynik czytamy od góry.
Ostatecznie w wyniku otrzymamy:
0,5 DEC =0,00 0011 BIN
Ogólna budowa liczby zmiennoprzecinkowej
Poprzedni przykład nie podał poprawnego wyniku tylko jak by to powiedzieć pseudo wynik.
Zapisując wynik liczby zmiennoprzecinkowej należy pamiętać o paru danych czyli: ZNAK,
CECHA i MANTYSA.
Liczba dziesiętna:
1000000000 DEC ⇒ 1,0 DEC⋅10
9
0,000000001 DEC ⇒1,0 DEC⋅10−9
mantysa
znak
+- 1,0 . 10-9
cecha
Liczba binarna:
1010110,101 BIN ⇒1,010110101 BIN⋅2
6
znak
+- 1,010110101 . 2 4 cecha
mantysa
W przypadku liczb binarnych 1 przed przecinkiem nie jest brana jako element mantysy gdyż
zawsze przed przecinkiem będzie 1.
Do zapisywania liczb zmiennoprzecinkowych służą dwa systemu:
•
single (float),
•
double.
SINGLE
1 bit 8 bitów – kod spolaryzowany
znak modu
cecha
23bity
mantysa
Przykład: zapisania liczby dziesiętnej w postaci SINGLE
22,2 DEC
0,2
0
0,4
0
0,8
1
0,6
1
|
obliczamy naszą część ułamkową
22 DEC =10110 BIN
|
następnie przeliczamy część całkowitą
10110,0011BIN
|
następnie składamy część całkowitą z częścią ułamkową
1,01100011BIN⋅24
|
przesuwamy przecinek na miejsce z 1 która znajduje się na
|
najstarszej pozycji i zliczamy ilość miejsc o ile został
|
przesunięty przecinek i liczba ta będzie cechą naszej liczby
|
tutaj 4
0,2
4127=131
|
przeliczamy cechę na kod spolaryzowany
131 DEC =10000011SPOL
|
cecha musi się składać z 8 bitów
0110 0011 BIN
|
odcinamy JEDYNKE sprzed przecinka wraz z przecinkiem
|
i otrzymujemy mantysę
|
ustalamy wartość bitu znaku w tym przypadku + czyli 0
0 BIN
Na koniec składamy wszystko do kupy
0 10000011 0110(0011)
0100000110110 0011 BIN |
otrzymujemy liczbę binarną zmiennoprzecinkową
rozpisujemy liczbę w okresie tyle razy aby zapełnić przynajmniej 32 bity
010000011011000110011001100110011 BIN
liczbę dzielimy na grupki po 4 znaki
0100
0001
1011
0001
1001
1001
1001
1001
1
w przypadku gdy za 32 bitem znajduje się 1 to dodajemy ją do ostatniej grupki i otrzymujemy 32
bitowy wynik, gry mamy 0 nie obcinamy je bo nie wpływają na wynik
0100
0001
1011
0001
1001
1001
1001
1010
przekształcamy grupki na kod szesnastkowy i otrzymujemy wynik:
41B1999A HEX =22,2 DEC
Przykład: zapisanie liczby SINGLE w postaci dziesiętnej
40A80000 HEX
40A80000 HEX =0100000010101000000000000000000 BIN |
0100000010101 BIN
0
10000001
0101
przekształcamy HEX na BIN
|
obcinamy zbędne ZERA
|
dzielimy liczbę wyznaczając ZNAK, CECHĘ i MANTYSĘ
10000001BIN
129−127=2
|
wyznaczamy wartość cechy
1,0101BIN
|
dodajemy przed mantysę 1 i przecinek
1,0101 BIN⋅2 =101,01BIN
|
przesuwamy przecinek o odpowiednią ilość miejsc
101BIN =5DEC
0,01 BIN =0,25 DEC
|
|
przeliczamy odpowiednio część całkowitą i ułamkową na
system dziesiętny
5 DEC 0,25 DEC =5,25 DEC
|
dodajemy liczby i otrzymujemy wynik
2
40A80000 HEX =5,25 DEC
0 ⇒00000000000000000000000000000000 BIN
NaN ⇒ 10000000000000000000000000000000 BIN
Inf ∞⇒ 01111111111111111111111111111111 BIN
−Inf −∞⇒11111111111111111111111111111111 BIN
DOUBLE
1 bit 11 bitów – kod spolaryzowany
znak modu
cecha
52bity
mantysa
11 bitowy kod spolaryzowany to polaryzacja 1023 zamiast 127 jak w kodzie 8 bitowym
Obliczanie wygląda tak jak w SINGLE z tym że cecha musi się składać z 11 bitów a nie z 8, a
mantysa z 52 bitów a nie 23.