Kalkulator liczb zmiennoprzecinkowych
Ten kalkulator pokazuje zapis liczby w standardzie IEEE 754 — bit znaku, wykładnik i mantysę — oraz ujawnia, czy liczba ma dokładną reprezentację w systemie dwójkowym.
🧮 Policz od razu
Dlaczego 0,1 + 0,2 nie daje 0,3
To pytanie zadaje sobie każdy początkujący programista. Odpowiedź jest prosta: 0,1 nie ma dokładnej reprezentacji w systemie dwójkowym — podobnie jak 1/3 nie ma jej w dziesiętnym. Komputer zapisuje najbliższą możliwą wartość, czyli 0,1000000000000000055511151231257827. Po dodaniu dwóch takich przybliżeń otrzymujemy 0,30000000000000004.
Budowa liczby zmiennoprzecinkowej
Standard IEEE 754 dzieli bity na trzy części. W formacie 64-bitowym (double): 1 bit znaku, 11 bitów wykładnika i 52 bity mantysy. W 32-bitowym (float): odpowiednio 1, 8 i 23. Wartość powstaje jako mantysa pomnożona przez dwa do potęgi wykładnika — to zapis naukowy przeniesiony na system dwójkowy.
Które liczby zapisują się dokładnie
Wyłącznie te, których część ułamkowa jest sumą potęg dwójki: 0,5 (1/2), 0,25 (1/4), 0,75 (1/2+1/4), 3,125 i tak dalej. Wszystkie liczby całkowite do 2⁵³ też zapisują się dokładnie. Zawodzą natomiast 0,1, 0,2, 0,3 — a więc niemal wszystko, co pojawia się w obliczeniach na pieniądzach.
Jak sobie z tym radzić
Trzy sprawdzone sposoby. Po pierwsze: nigdy nie porównuj liczb zmiennoprzecinkowych operatorem równości — sprawdzaj, czy różnica jest mniejsza od małej wartości progowej. Po drugie: przy kwotach pieniężnych przechowuj grosze jako liczby całkowite zamiast złotówek jako ułamków. Po trzecie: w bazach danych używaj typu dziesiętnego, który przechowuje cyfry, a nie przybliżenie binarne.
Kiedy się przydaje?
Przy nauce programowania i architektury komputerów, przy debugowaniu dziwnych wyników obliczeń, przy projektowaniu systemów finansowych, przy pracy z systemami wbudowanymi o ograniczonej precyzji oraz przy przygotowaniach do egzaminów z informatyki.
Wartości specjalne
Standard rezerwuje kilka kombinacji bitów na wartości szczególne: dodatnią i ujemną nieskończoność, wartość nieokreśloną NaN (wynik dzielenia zera przez zero albo pierwiastka z liczby ujemnej) oraz osobne zero dodatnie i ujemne. Ta ostatnia osobliwość sprawia, że w większości języków programowania zero dodatnie równa się ujemnemu, choć ich zapisy bitowe różnią się bitem znaku.