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,0011BIN | następnie składamy część całkowitą z częścią ułamkową 1,01100011BIN⋅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 4127=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.