Kody i szyfry
2. Kody numeryczne i arytmetyka cyfrowa
2.10. Zapis stałoprzecinkowy
Już wiemy z poprzednich punktów jak można reprezentować liczby naturalne i 0 w systemie cyfrowym oraz jak można reprezentować liczby całkowite czyli mówiąc niezbyt precyzyjnie liczby ze znakiem. Często jednak chcemy reprezentować w systemie cyfrowym ułamki (liczby wymierne) i do tego celu wykorzystujemy koncepcję zapisu stałoprzecinkowego (ang. fixed point notation).
Oczywiście naturalnym pomysłem jest reprezentowanie liczby wymiernej jako pary uporządkowanej liczb całkowitych (m,n), gdzie m, n ∈ Z. Tak czasem się robi ale algorytmy wykonywania działań arytmetycznych (i porównywanie liczb) okazuje się bardziej skomplikowane niż w zdefiniowanym poniżej zapisie stałoprzecinkowym.
Do uwzględnienia znaku można użyć zapisu uzupełnień do W, uzupełnień do W-1 lub zapisu moduł znak. W szczególności możemy użyć zapisu U2 lub U1. Dla ustalenia uwagi zakładamy, że używamy zapisu uzupełnień do W.
Zapis stałoprzecinkowy (uzupełnień do W) ze stałą długością słowa kodowego definiujemy następująco. Będziemy reprezentować liczby ze zbioru A = {−<em>W<sup>n</sup> + k</em>⋅<em>W</em><sup>−<em>r</em></sup>; <em>k</em> ∈ < 0, <em>W</em><sup><em>n</em>+<em>r</em>+1</sup>>} (gdzie n ≥ 1, r ≥ 0, n, r ∈ Z). Liczbę n ∈ A reprezentujemy słowem anan-1...a0a-1...a-r (słowem nad alfabetem <0, W−1>) tak by był spełniony wzór
Jeśli założymy, że an ∈ {0,<em>W</em>−1} i ai ∈ {0,<em>W</em>−1} to takie słowo anan-1...a0a-1...a-r jest wyznaczone jednoznacznie.
Rys. 1. Rozmieszczenie na osi liczbowej liczb reprezentowanych w zapisie stałoprzecinkowym. Warto zwrócić uwagę na równomierne rozmieszczenie reprezentowanych liczb. ”Skok” czyli odległość sąsiednich liczb wynosi W−r.
Liczba dodatnia reprezentowana jest więc ciągiem 0an-1an-2...a0a-1...a-r i możemy zapisać
a liczba ujemna ciągiem
gdzie an = W −1.
Dla W=2 czyli dla zapisu binarnego mamy 1 bit znaku, n bitów części całkowitej i r bitów części ułamkowej.
Algorytm obliczania liczby przeciwnej do danej jest identyczny jak w przypadku zapisu uzupełnień do W. W celu znalezienia liczby przeciwnej obliczamy uzupełnienie do W słowa wejściowego.
Analogicznie jak wyżej można zdefiniować zapis stałoprzecinkowy o zmiennej długości słowa kodowego.
Oczywiście zapisy U2, U1 i moduł znak tak jak zdefiniowano je w punktach poprzednich można traktować jako zapisy stałoprzecinkowe z odpowiednio umieszczonym przecinkiem.
Rys. 2. Koncepcja zapisu stałoprzecinkowego