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 9 5, 3 2 1 Kolejne potęgi 10 2 5 10 1 3 10 1 2 10 2 1 10 3 Kolejne ułamki 90 5 0,3 0,02 0,001 Przykład binarny: Liczba binarna 0, 1 1 1 1 1 Kolejne potęgi 0 2 1 1 2 1 1 2 2 1 2 3 1 2 4 1 2 5 Kolejne ułamki 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 + - 1,0. 10-9 cecha znak mantysa
Liczba binarna: 1010110,101 BIN 1,010110101 BIN 2 6 + - 1,010110101. 2 4 cecha znak 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 23bity znak modu cecha mantysa Przykład: zapisania liczby dziesiętnej w postaci SINGLE 22,2 DEC 0,2 0 obliczamy naszą część ułamkową 0,4 0 0,8 1 0,6 1 0,2 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 2 4 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
4 127=131 przeliczamy cechę na kod spolaryzowany 131 DEC =10000011 SPOL cecha musi się składać z 8 bitów 0110 0011 BIN odcinamy JEDYNKE sprzed przecinka wraz z przecinkiem i otrzymujemy mantysę 0 BIN ustalamy wartość bitu znaku w tym przypadku + czyli 0 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 =0100000010101000000000000000000 BIN przekształcamy HEX na BIN 0100000010101 BIN obcinamy zbędne ZERA 0 10000001 0101 dzielimy liczbę wyznaczając ZNAK, CECHĘ i MANTYSĘ
10000001 BIN 129 127=2 wyznaczamy wartość cechy 1,0101 BIN dodajemy przed mantysę 1 i przecinek 1,0101 BIN 2 2 =101,01 BIN przesuwamy przecinek o odpowiednią ilość miejsc 101 BIN =5 DEC przeliczamy odpowiednio część całkowitą i ułamkową na 0,01 BIN =0,25 DEC system dziesiętny 5 DEC 0,25 DEC =5,25 DEC dodajemy liczby i otrzymujemy wynik = 5,25 DEC 0 00000000000000000000000000000000 BIN NaN 10000000000000000000000000000000 BIN Inf 01111111111111111111111111111111 BIN Inf 11111111111111111111111111111111 BIN DOUBLE 1 bit 11 bitów kod spolaryzowany 52bity znak modu cecha 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.