Stało i zmiennopozycyjna reprezentacja liczb ułamkowych
Stałopozycyjna reprezentacja liczb
Stałopozycyjna reprezentacja liczb pozwala na zapisanie liczby ułamkowej i wykonywanie na niej wielu obliczeń w taki sposób, jakby to była liczba całkowita. W praktyce przyjmuje się założenie, że w zwykłej n-bitowej liczbie całkowitej część bitów określa cyfry przed przecinkiem, a pozostałą część cyfr jest za przecinkiem. Przecinek jest na stałej pozycji w liczbie. O tym podziale musi pamiętać programista, gdyż z punktu widzenia procesora są to zwykłe liczby całkowite. Zamiast przecinka, paczki bitów rozdziela się najczęściej dodatkowym odstępem.
Jako przykład można rozważyć liczbę 8-mio bitową. W kodzie NKB pozwala ona na zapisanie wartości od 0 do 255. Jeżeli jednak przyjmie się założenie, że np. przecinek jest pośrodku za czterema bitami to pozwoli to na zapisanie liczby od 0 do 15,9375 z dokładnością 0,0625. Zakresy te wynikają z innych wartości cyfr składających się na liczbę binarną.
Zamiana ułamka w postaci binarnej na wartość dziesiętną
Metoda zamiany jest dokładnie taka sama jak w przypadku liczb całkowitych, tylko wartości cyfr są inne a co za tym idzie, inne są wykładniki potęg dwójki. Tutaj także liczby 2 podnosi się do liczby określającej pozycję cyfry, tylko że ta pozycja jest numerowana zaczynając od cyfry przed przecinkiem. Dla cyfr za przecinkiem wykładniki potęgi są ujemne.
Przykład - Obliczyć wartość dziesiętną liczby 0110 1010(2)
0110 1010(2) = 0*23 + 1*22 + 1*21 + 0*20 + 1*2-1 + 0*2-2 + 1*2-3 + 0*2-4 = 4 + 2 + 0,5 + 0,125 = 6,625(10)
Zamiana ułamka dziesiętnego na wartość binarną
Metoda zamiany jest dwuetapowa. Najpierw zamieniana jest część całkowita ułamka. Wtedy stosuje się cykliczne dzielenie przez 2 i sprawdzanie reszty z dzielenia. Następnie zamienia się część ułamkową. Zamiana polega na cyklicznym mnożeniu ułamka razy 2 i sprawdzaniu, czy wynik nie jest większy lub równy 1. Jeżeli jest >= 1 to wyznaczony bit części ułamkowej jest także równy jeden. Do dalszych obliczeń bierze się część ułamkową wyniku.
Czasem zamiana części ułamkowej na postać binarną prowadzi do osiągnięcia nieskończenie długiej kombinacji zer i jedynek. Dlatego zawsze należy przyjąć dodatkowy warunek - ile bitów jest przeznaczone na zapis części ułamkowej. Obliczenia wykonuje się wtedy dotąd, aż osiągnie się potrzebną liczbę bitów
Przykład - Zamienić ułamek 12,7 na postać binarną 8-bitową, gdzie przecinek jest po czterech bitach (4b,4b).
Część całkowita 12(10) to w postaci dwójkowej 1100(NKB). Obliczanie części ułamkowej wygląda następująco:
0,7*2=1,4 |
1 (MSB) |
0,4*2=0,8 |
0 |
0,8*2=1,6 |
1 |
0,6*2=1,2 |
1 (LSB) |
0,2*2=... |
... |
Obliczenia przerywa się po uzyskaniu wymaganych 4 bitów. Bit wyznaczony na początku obliczeń jest najbardziej znaczący. Dlatego wynikiem tych obliczeń jest 1011(2). Całość można zapisać następująco: 12,7(10) = 1100 1011(NKB). I należy tutaj pamiętać, że ta równość jest zachowana z pewnym przybliżeniem, gdyż ograniczono się jedynie do 4 bitów w części ułamkowej wprowadzając tym samym niewielki błąd zaokrąglenia liczby.
Liczby ujemne a system stałopozycyjny
Obsługa ułamków w kodzie U2 jest dokładnie taka sama jak w przypadku liczb całkowitych. Pierwszy bit w liczbie decyduje o tym, czy liczba jest ujemna.
Zamiana z kodu U2 na system dziesiętny polega więc na zwykłym zsumowaniu wartości cyfr z uwzględnieniem innej numeracji ich pozycji. Trzeba tylko pamiętać o tym, że pierwszy bit ma ujemną wartość.
Zamiana z ujemnego ułamka dziesiętnego na kod U2 też jest analogiczna do konwersji liczb całkowitych. Najlepiej najpierw zamienić na kod U2 wartość dodatnią a później dokonać negacji i dodać 1 do bitu na ostatniej pozycji.
Zmiennopozycyjna postać zapisu liczb ułamkowych
Zmiennopozycyjne ułamki są obsługiwane sprzętowo przez koprocesor matematyczny i co za tym idzie, są najczęściej wykorzystywane przez programistów (większy zakres liczb, najczęściej większa dokładność przy sensownej szybkości). Ze względu na trudność zagadnień związanych z tym zapisem, ich znajomość nie będzie wymagana na zajęciach, choć może być konieczna na maturze z informatyki. Tutaj zostaną jedynie zasygnalizowane pewne właściwości tych liczb.
Zapis ten charakteryzuje się zmienną pozycją przecinka co pozwala na zapisywanie liczb o różnych rzędów wielkości takich jak np. -43538200000000 czy też 0,0000000231436. W praktyce stosowana jest notacja naukowa (wykładnicza), która w przypadku powyższych liczb będzie wyglądać następująco: -4,35382*1013 oraz 2,31436*10-8. I właśnie w taki sposób zapisywane są liczby zmiennopozycyjne w komputerze. Jedyna różnica polega na tym, że tam stosuje się system dwójkowy i ogólna postać liczby wygląda następująco: m*2c.
"m" to mantysa i jest to ułamek w kodzie U2 zawierający informację o znaczących cyfrach liczby. W komputerze ułamek ten najczęściej jest zapisywany w ten sposób, że przed przecinkiem jest tylko bit znaku a reszta bitów tworzy część ułamkową. Warto zauważyć, że w systemie dziesiętnym liczba pi może być przedstawiona tak: 0,31415*101 albo tak: 0,00314*103. Pierwszy przypadek pozwala na dokładniejsze zapamiętanie liczby (jest więcej tzw. cyfr znaczących w części ułamkowej. Taka zmiana zapisu ułamka, która pozwoli na napisanie większej ilości cyfr znaczących określana jest mianem normalizacji i jest wykonywana w systemie dwójkowym automatycznie przez koprocesor matematyczny.
"c" to cecha i jako wykładnik potęgi jest liczbą całkowitą w kodzie U2. O ile mantysa określa cyfry znaczące liczby, o tyle cecha decyduje o jej rzędzie wielkości (jak bardzo duża, lub mała jest ta liczba).
Liczba zmiennopozycyjna jest zapisywana jako słowo n-bitowe składające się z dwóch paczek bitów - cechy i mantysy. Z punktu widzenia programisty nie jest istotna konstrukcja takiego słowa. Powinien on jedynie zdawać sobie sprawę z dokładności i zakresu liczb, jakie mogą zostać zapisane za pomocą takiego typu danych.