Wizualizator liczb zmiennoprzecinkowych IEEE-754
Zobacz dokładnie, jak liczba dziesiętna jest przechowywana jako liczba zmiennoprzecinkowa IEEE-754 – bit znaku, bity wykładnika i bity mantysy – i dlaczego liczby takie jak 0,1 nie są przechowywane dokładnie.
🔒 Przetwarzane w całości w Twojej przeglądarce — nic, co tu wpiszesz, nie zostanie nigdy przesłane.
Wynik
Każda liczba zmiennoprzecinkowa przechowywana przez komputer – liczba JavaScript, float w C, float w Pythonie – jest kodowana w ten sam sposób zgodnie z IEEE 754: jeden bit znaku, blok bitów wykładnika i blok bitów mantysy (ułamka). Pojedyncza precyzja (32-bitowa) używa 1 bitu znaku, 8 bitów wykładnika i 23 bitów mantysy; podwójna precyzja (64-bitowa), format stojący za domyślnym typem liczbowym niemal każdego języka, używa 1 bitu znaku, 11 bitów wykładnika i 52 bitów mantysy. To narzędzie bierze dowolną wpisaną liczbę dziesiętną, koduje ją w wybranej szerokości przy użyciu wbudowanego w przeglądarkę enkodera float (DataView/ArrayBuffer) – tej samej maszynerii, na której faktycznie działa Twój kod – i koloruje każdy bit według obszaru, do którego należy.
Samo kodowanie przebiega w trzech krokach, a to narzędzie przeprowadza przez wszystkie, zamiast tylko pokazywać końcowe bity. Po pierwsze, normalizacja: liczba jest przepisywana jako 1,mantysa × 2^wykładnik, z dokładnie jedną niezerową cyfrą przed kropką binarną (liczby zbyt małe, by to osiągnąć, są traktowane jako liczby subnormalne, bez domyślnej wiodącej jedynki). Po drugie, obciążenie wykładnika: ponieważ pole wykładnika musi przechowywać zarówno dodatnie, jak i ujemne wykładniki jako liczbę bez znaku, przed zapisaniem wartości w postaci binarnej dodawane jest stałe obciążenie (127 dla pojedynczej precyzji, 1023 dla podwójnej). Po trzecie, część ułamkowa mantysy jest rozwijana bit po bicie klasyczną metodą „pomnóż przez dwa, część całkowitą weź jako kolejny bit, zachowaj resztę” – powtarzaną aż do wypełnienia pola mantysy, po czym pozostałe bity decydują, czy wynik jest zaokrąglany w górę czy w dół (zaokrąglanie do najbliższej parzystej, domyślne w IEEE-754).
Właśnie dlatego tak zwykła liczba jak 0,1 nie jest przechowywana dokładnie. W systemie binarnym 0,1 to ułamek okresowy (0,0001100110011…, w nieskończoność), więc żadna skończona mantysa nie może jej precyzyjnie zapisać – gdzieś trzeba ją zaokrąglić. Zakoduj 0,1 jako liczbę 32-bitową i odczytaj bity z powrotem, a nie otrzymasz 0,1: otrzymasz dokładnie 0,100000001490116119384765625. Podwójna precyzja ma do dyspozycji 29 bitów mantysy więcej, więc jej błąd zaokrąglenia jest znacznie mniejszy, ale również niezerowy – 0,1 jako 64-bitowa liczba double to dokładnie 0,1000000000000000055511151231257827021181583404541015625. To narzędzie oblicza tę dokładną przechowywaną wartość za pomocą arytmetyki dużych liczb całkowitych (bez skrótów zmiennoprzecinkowych), więc różnica między tym, co wpisałeś, a tym, co faktycznie przechowuje sprzęt, nigdy nie jest ukrywana ani przybliżana.
Wartości specjalne otrzymują dokładne, zarezerwowane wzorce bitowe zamiast normalnego kodowania: zero i zero ujemne mają same zera w bitach wykładnika i mantysy (różni się tylko bit znaku), ±Nieskończoność ma same jedynki w bitach wykładnika i same zera w mantysie, a NaN ma same jedynki w bitach wykładnika i co najmniej jeden ustawiony bit mantysy. Wszystko tu działa lokalnie w Twojej przeglądarce – nic, co wpiszesz, nie jest nigdzie przesyłane – co czyni to bezpiecznym miejscem do budowania prawdziwej intuicji na temat błędów zmiennoprzecinkowych: dlaczego `0.1 + 0.2 !== 0.3` w niemal każdym języku programowania, dlaczego tekstury float32 w kodzie graficznym tracą precyzję, której nie straciłyby float64, i dlaczego kod finansowy powinien generalnie w ogóle unikać binarnego zapisu zmiennoprzecinkowego.