Liczby binarne stało- i zmiennoprzecinkowe: Reprezentacja ułamków w komputerze
Do tej pory omawialiśmy liczby całkowite, jednak świat fizyczny, grafika 3D, obliczenia naukowe oraz codzienne aplikacje wymagają operowania na liczbach niecałych (ułamkowych), takich jak 3.14, 0.001 czy -273.15. W ramach przedmiotu UTK (Urządzenia Techniki Komputerowej) przyszły technik musi poznać dwa główne sposoby, w jakie procesor i systemy cyfrowe radzą sobie z zapisem ułamków: arytmetykę stałoprzecinkową oraz standard zmiennoprzecinkowy.
1. Liczby stałoprzecinkowe (Fixed-Point)
W reprezentacji stałoprzecinkowej pozycja "kropki" (separatora dziesiętnego) jest z góry ustalona na stałe dla całej struktury bitowej:
- Zasada działania: Załóżmy, że rejestr ma 16 bitów, a konwencja zakłada, że pierwsze 8 bitów reprezentuje część całkowitą, a kolejne 8 bitów część ułamkową. Kropka binarna nigdy nie zmienia swojego położenia.
- Zalety i wady: Rozwiązanie to jest bardzo szybkie w obliczeniach i nie wymaga skomplikowanego sprzętu (często stosowane w starszych mikrokontrolerach lub systemach wbudowanych bez koprocesora matematycznego). Jego wadą jest jednak bardzo ograniczony zakres wartości – nie można w tym samym formacie zapisać zarówno liczby bardzo małej, jak i gigantycznej.
2. Liczby zmiennoprzecinkowe (Floating-Point / Standard IEEE 754)
Aby umożliwić komputerom operowanie na niezwykle małych oraz niesamowicie dużych liczbach za pomocą tego samego formatu, stworzony został uniwersalny standard IEEE 754:
- Zasada działania (notacja naukowa): Liczba zmiennoprzecinkowa zapisywana jest w postaci podobnej do notacji wykładniczej: $Liczba = Znak \cdot Mantysa \cdot Podstawa^{Wykladnik}$ (gdzie podstawą w informatyce jest oczywiście 2). Pozycja kropki „pływa” w zależności od wykładnika.
- Główne formaty standardu IEEE 754:
- Pojedyncza precyzja (Single Precision – 32 bity): Składa się z 1 bitu znaku, 8 bitów wykładnika (exponent) oraz 23 bitów mantysy.
- Podwójna precyzja (Double Precision – 64 bity): Składa się z 1 bitu znaku, 11 bitów wykładnika oraz 52 bitów mantysy, co zapewnia ogromną dokładność obliczeń.
3. Anatomia liczby zmiennoprzecinkowej (32-bitowy format IEEE 754)
Struktura 32-bitowej liczby zmiennoprzecinkowej rozkładana jest na trzy niezależne pola:
- Bit znaku ($S$ – bit 31): Określa znak liczby (
0= liczba dodatnia,1= liczba ujemna). - Wykładnik ($E$ – bity 30-23): Przechowuje potęgę dwójki, z uwzględnieniem tzw. przesunięcia (bias), co pozwala zapisywać zarówno dodatnie, jak i ujemne wykładniki.
- Mantysa / Ułamek ($M$ – bity 22-0): Określa znaczące cyfry ułamka (zazwyczaj z domyślnie znormalizowaną wiodącą jedynką równą 1).
Strategia technika
Podczas programowania mikrokontrolerów, optymalizacji kodu lub analizy wydajności aplikacji pamiętaj, że obliczenia na liczbach zmiennoprzecinkowych (typ float lub double) są znacznie bardziej obciążające dla procesora niż operacje na liczbach całkowitych. W prostych urządzeniach IoT czy sterownikach przemysłowych, gdzie nie jest wymagana ekstremalna precyzja, inżynierowie często celowo zamieniają ułamki na liczby stałoprzecinkowe (np. mnożąc temperaturę przez 100 i przesyłając ją jako zwykłą liczbę całkowitą), aby drastycznie przyspieszyć działanie kodu i zmniejszyć zużycie energii.