Podręcznik

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, nZ. 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 = {−<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

n = -(\text{sgn } a_n)W^n + \displaystyle\sum_{i=-r}^{n-1}a_iW^i\qquad(*)

Jeśli założymy, że an  ∈ {0,<em>W</em>−1} i a ∈ {0,<em>W</em>−1} to takie słowo anan-1...a0a-1...a-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 Wr.

Liczba dodatnia reprezentowana jest więc ciągiem 0an-1an-2...a0a-1...a-r i możemy zapisać

0an-1an-2...a0a-1...a-r = \displaystyle\sum^{n-1}_{r=-r}a_iW^i

a liczba ujemna ciągiem

anan-1an-2...a0a-1...a-r = -W^n + \displaystyle\sum^{n-1}_{r=-r}a_iW^i

gdzie an  = W −1.

Zauważmy, że słowo o długości n+r+1 zostało podzielone na 3 części, 3 pola: „znak”, „część całkowitą” (tutaj przecinek lub kropka) i „część ułamkową” (por. Rys. 2 dla przypadku W=2). Wprowadzamy przecinek lub kropkę pomiędzy część całkowitą i ułamkową nie zapisując jednak formalnie w specjalny sposób tego symbolu. Poprzestajemy na umowie, że kropka znajduje się w określonym miejscu słowa. Czasami w zapisie stałoprzecinkowym nie ma części całkowitej, czasami nie ma ułamkowej.

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