Podręcznik
2. Kody numeryczne i arytmetyka cyfrowa
2.11. Zapis zmiennoprzecinkowy
Zapis zmiennoprzecinkowy lub notacja zmiennoprzecinkowa (czasem mówimy zapis zmiennopozycyjny) to jeden z najczęściej stosowanych w mikroprocesorach kodów numerycznych. Angielskie nazwy to floating point notation lub scientific notation.
Zasadniczy pomysł jest bardzo prosty. Liczby bardzo duże i bardzo małe wygodnie jest zapisywać w następującej wykładniczej postaci np. x = −1,5 ⋅ 1015 lub ogólniej w postaci x = (−1)s ⋅ ⋅ We. Możemy zakładać, że W ∈ N, W ≥ 2 ale w praktyce wykorzystujemy W = 10 lub W = 2.
W dalszym ciągu będziemy zakładać, że W = 2 i będziemy rozważać zapis zmiennoprzecinkowy binarny. Liczba s ∈ {0,} reprezentuje znak liczby x. Liczbę ≥ 0 nazywamy mantysą (lub częścią ułamkową ang. mantissa lub fraction) a liczbę e wykładnikiem (lub cechą ang. exponent). Tak więc liczbę x = (−1)s ⋅ ⋅ We możemy reprezentować jako trójkę uporządkowaną (s, , e) czyli trójkę (znak,mantysa,wykladnik).
Oczywiście jeśli nie narzucimy dodatkowych warunków na i e to takie przedstawienie nie jest jednoznaczne. Liczby i e muszą być ponadto zapisane w ustalonych kodach numerycznych. Zakładamy w dalszym ciągu, że są to kody numeryczne binarne.
Przedstawienie liczby staje się jednoznaczne jeśli liczba ma tzw. postać znormalizowaną. Mówimy, że liczba reprezentowana w zapisie ma postać znormalizowaną jeśli mantysa zapisana w zapisie stałoprzecinkowym bez znaku (z przecinkiem za pierwszym bitem) ma postać: 1.ciąg bitów czyli
(jedynka przed przecinkiem jako pierwszy bit, przecinek (czyli kropka), ciąg bitów)
co odpowiada wartości z przedziału [1,2). Ponieważ liczby pamiętamy w postaci znormalizowanej nie ma potrzeba pamiętania pierwszego bitu mantysy .
Najczęściej zapis zmiennoprzecinkowy używany jest zgodnie ze standardem IEEE 754. Poniżej opiszemy formaty tego standardu dla słów 32 i 64 bitowych.
Rys. 3. Rozmieszczenie na osi liczbowej liczb reprezentowanych w zapisie zmiennoprzecinkowym. Warto zwrócić uwagę na charakterystyczne nierównomierne rozmieszczenie reprezentowanych liczb. Odległość sąsiednich liczb jest najmniejsza w pobliżu zera i rośnie wraz ze wzrostem odległości od 0.
Rys. 4. Format standardu zapisu zmiennoprzecinkowego IEEE 754 dla pojedynczej precyzji (ang. single precision). Słowa są 32 bitowe.
Rys. 5. Format standardu zapisu zmiennoprzecinkowego IEEE 754 dla podwójnej precyzji (ang. double precision). Słowa są 64 bitowe.
Część ułamkowa zgodnie uwagą o postaci znormalizowanej pozbawiona jest w standardzie IEEE 754 pierwszej 1. Chcąc więc odtworzyć rzeczywistą wartość należy poprzedzić ciąg bitów jedynką i odczytać (1.) jako liczbę zapisaną w zapisie stałoprzecinkowym bez znaku.
Z kolei bit znaku s=1 oznacza liczb ujemną a równy 0 liczbę dodatnią.
W dosyć specjalnym kodzie zapisany jest wykładnik e jest to mianowicie tzw. obciążony kod NKB. W ogólnym przypadku dla słowa n bitowego jest to kod numeryczny przyporządkowujący liczbom całkowitym ze zbioru <−2n−1+1,2n−1> kolejne słowa kodowe kodu n bitowego NKB. W standardzie IEEE 754 dla słowa 32 bitowego na zapamiętanie e mamy 8 bitów więc stosujemy do kodowania e obciążony 8 bitowy kod NKB.