Konwerter liczb zmiennoprzecinkowych IEEE 754
Konwertuj liczby zmiennoprzecinkowe na binarny i szesnastkowy zapis IEEE 754 — precyzja połowiczna, pojedyncza, podwójna i bfloat16. Zobacz dokładną przechowywaną wartość, błąd zaokrąglenia i układ bitów. 100% w przeglądarce.
| Znak | |
| Wykładnik | |
| Mantysa |
- Wprowadzono
- Faktycznie przechowywane
- Błąd zaokrąglenia
- Poprzednia
- Następna
- ULP (odstęp)
| Format | Łączna liczba bitów | Znak | Wykładnik | Mantysa | Bias | Maksymalna wartość skończona | Cyfry dziesiętne |
|---|---|---|---|---|---|---|---|
| binary16 (FP16) | 16 | 1 | 5 | 10 | 15 | 65504 | ~3.3 |
| bfloat16 | 16 | 1 | 8 | 7 | 127 | ≈3.39×10³⁸ | ~2.3 |
| binary32 (FP32) | 32 | 1 | 8 | 23 | 127 | ≈3.40×10³⁸ | ~7.2 |
| binary64 (FP64) | 64 | 1 | 11 | 52 | 1023 | ≈1.80×10³⁰⁸ | ~15.9 |
Czym jest zapis zmiennoprzecinkowy IEEE 754?
IEEE 754 to standard określający, jak komputery przechowują liczby rzeczywiste w postaci binarnej. Każda wartość jest upakowana w trzy pola: bit znaku, wykładnik (przechowywany z przesunięciem — tzw. bias — dzięki czemu reprezentuje zarówno ogromne, jak i maleńkie rzędy wielkości; w polskiej literaturze bywa nazywany cechą) oraz mantysę z cyframi znaczącymi. Korzysta z niego niemal każdy procesor, GPU i język programowania — dlatego te same niespodzianki z zaokrąglaniem pojawiają się w JavaScript, Pythonie, C i SQL.
Kluczowa obserwacja: binarny zapis zmiennoprzecinkowy reprezentuje wyłącznie liczby postaci m × 2ⁿ. Ułamki dziesiętne takie jak 0.1 są w systemie dwójkowym nieskończonymi ułamkami okresowymi — 0.000110011001100… — więc format przechowuje najbliższego reprezentowalnego sąsiada. W pojedynczej precyzji jest to 0.100000001490116119384765625; w podwójnej — 0.1000000000000000055511151231257827021181583404541015625. Żadna z tych wartości nie jest równa 0.1. Każda dalsza osobliwość — 0.1 + 0.2 ≠ 0.3, sumy, które dryfują, testy równości, które zawodzą — wynika z tego jednego faktu, a ten konwerter czyni go widocznym, wypisując dokładną przechowywaną wartość zamiast zaokrąglonego przybliżenia.
Standard rezerwuje też wzorce bitowe dla wartości specjalnych. Wykładnik z samych jedynek koduje ±Infinity (mantysa zerowa) lub NaN (mantysa niezerowa); wykładnik z samych zer koduje zero ze znakiem (mantysa zerowa) lub liczby subnormalne (mantysa niezerowa), które wypełniają lukę niedomiaru tuż obok zera przy zmniejszonej precyzji. Cztery formaty obsługiwane przez to narzędzie — binary16/FP16, bfloat16, binary32/FP32, binary64/FP64 — różnią się wyłącznie liczbą bitów przyznanych każdemu polu: więcej bitów wykładnika to większy zakres, więcej bitów mantysy to większa precyzja. bfloat16, ulubieniec uczenia maszynowego, to po prostu FP32 z odciętymi dolnymi 16 bitami mantysy: ten sam zakres, znacznie grubsza precyzja.
Przydatny model myślowy: wartości reprezentowalne tworzą na osi liczbowej siatkę, której odstęp — jedna jednostka na ostatnim miejscu, czyli ULP — podwaja się przy każdej potędze dwójki. W okolicy 1.0 odstęp siatki double wynosi około 2,22 × 10⁻¹⁶; w okolicy 2⁵³ to już cała jedynka, dlatego double nie potrafi niezawodnie liczyć powyżej 2⁵³. Panel sąsiadów w tym narzędziu pokazuje tę siatkę wprost: poprzednią i następną wartość reprezentowalną wokół wpisanej liczby wraz z dokładnym odstępem między nimi.
// Float ↔ hex through the raw IEEE 754 bits (works in any browser / Node.js)
const buf = new DataView(new ArrayBuffer(8));
function floatToHex32(value) {
buf.setFloat32(0, value); // rounds to nearest even
return '0x' + buf.getUint32(0).toString(16).toUpperCase().padStart(8, '0');
}
function hexToFloat32(hex) {
buf.setUint32(0, parseInt(hex, 16));
return buf.getFloat32(0);
}
floatToHex32(0.1); // '0x3DCCCCCD'
floatToHex32(3.14159); // '0x40490FD0'
hexToFloat32('3DCCCCCD'); // 0.10000000149011612 Kluczowe funkcje
Cztery formaty, jeden widok
Połowiczna (FP16), bfloat16, pojedyncza (FP32) i podwójna (FP64) — jedno kliknięcie przełącza format i przelicza całą stronę, więc porównanie, jak ta sama liczba ląduje w każdym z formatów, zajmuje sekundy.
Klikalna siatka bitów
Każdy bit jest przyciskiem. Można odwrócić znak, przesunąć wykładnik albo zmienić bit mantysy i patrzeć, jak widoki dziesiętny, szesnastkowy i binarny aktualizują się natychmiast — najszybsza droga do intuicji na temat tego kodowania.
Dokładna przechowywana wartość, nie przybliżenie
Narzędzie oblicza pełne rozwinięcie dziesiętne przechowywanych bitów dokładną arytmetyką wielkich liczb całkowitych — wszystkie 55 cyfr dla 0.1 w double — wraz z dokładnym błędem zaokrąglenia ze znakiem względem wpisanej wartości.
Sąsiedzi i ULP
Widać poprzednią i następną wartość reprezentowalną wokół bieżącej liczby oraz dokładny odstęp (ULP) między nimi — gęstość siatki, która decyduje o tym, ile precyzji faktycznie jest dostępne przy danym rzędzie wielkości.
Wartości specjalne na jedno kliknięcie
Przyciski wczytują ±0, ±Infinity, NaN, najmniejszą liczbę subnormalną i największą skończoną wartość wybranego formatu, a etykieta klasyfikacji nazywa to, co koduje bieżący wzorzec bitowy.
Linki do udostępniania, zero wysyłania
Przycisk „Kopiuj link” koduje format i dokładny wzorzec bitowy w adresie URL — idealne do zgłoszeń błędów, code review i nauczania. Wszystko działa w przeglądarce; wpisywane wartości nie opuszczają strony.
Przykłady konwersji IEEE 754
0.1 w pojedynczej precyzji — klasyczny błąd zaokrąglenia
0.1
0x3DCCCCCD — faktycznie przechowywane jako 0.100000001490116119384765625
Dziesiętne 0.1 nie ma skończonej reprezentacji binarnej, więc IEEE 754 przechowuje zamiast niego najbliższą wartość reprezentowalną. W pojedynczej precyzji (FP32) jest to 0x3DCCCCCD, czyli dokładnie 0.100000001490116119384765625 — o około 1,49 × 10⁻⁹ za dużo. Narzędzie pokazuje tę dokładną przechowywaną wartość i dokładny błąd, cyfra po cyfrze, zamiast zaokrąglonego „0.1”, które wypisuje język programowania. Ten jeden przykład tłumaczy większość zmiennoprzecinkowych niespodzianek, w tym to, dlaczego 0.1 + 0.2 nie równa się 0.3.
Float na hex: 3.14159 w FP32
3.14159
0x40490FD0
Po wpisaniu 3.14159 przy wybranej precyzji pojedynczej (FP32) pole hex pokazuje 0x40490FD0 — znak 0, wykładnik z przesunięciem 128 (czyli 2¹), mantysa 0x490FD0. Faktycznie przechowywana wartość to 3.141590118408203125, odrobinę powyżej wpisanej liczby. Zapis szesnastkowy spotyka się w zrzutach ruchu sieciowego, buforach GPU, podglądzie rejestrów i serializowanych plikach binarnych, a konwersja działa w obie strony: wystarczy wkleić 40490FD0 do pola hex, aby zdekodować wartość z powrotem.
Maksimum FP16: na 65504 kończy się precyzja połowiczna
65504
0x7BFF — największa skończona wartość FP16
Precyzja połowiczna ma tylko 5 bitów wykładnika i 10 bitów mantysy, więc jej największa skończona wartość to 65504 (0x7BFF). Po wpisaniu 65520 lub czegokolwiek większego wynik zaokrągla się do Infinity (0x7C00) — realne zagrożenie przy kwantyzacji modeli uczenia maszynowego do FP16. Po przełączeniu na bfloat16 to samo 65520 mieści się bez trudu, ponieważ bfloat16 zachowuje 8 bitów wykładnika z FP32 (zakres), oddając w zamian bity mantysy (precyzję). Właśnie ten kompromis sprawia, że trening ML preferuje bfloat16, a kompaktowe przechowywanie danych — FP16.
−0 i +0: dwa różne wzorce bitowe, jedna wartość
-0
0x80000000 (FP32), podczas gdy +0 to 0x00000000
IEEE 754 ma zero ze znakiem: −0 ustawia wyłącznie bit znaku (0x80000000 w FP32), a +0 składa się z samych zer. W każdym języku porównują się jako równe, a mimo to 1/−0 daje −Infinity, a 1/+0 daje +Infinity, więc różnica jest obserwowalna. Kliknięcie bitu znaku w narzędziu przełącza między nimi — etykieta klasyfikacji pozostaje na „Zero”, choć zapis hex się zmienia. To ilustracja jednym kliknięciem, dlaczego równość na poziomie bitów i równość liczbowa to dwie różne rzeczy.
Jak konwertować liczby zmiennoprzecinkowe IEEE 754
- 1
Wybór formatu zmiennoprzecinkowego
Domyślnie wybrana jest precyzja pojedyncza (FP32). Można przełączyć na podwójną (FP64) dla liczb w stylu JavaScript/Python albo na połowiczną (FP16) i bfloat16 — formaty 16-bitowe używane w uczeniu maszynowym i grafice.
- 2
Wpisanie liczby dziesiętnej
Wystarczy wpisać dowolną wartość — 0.1, -2.5e3, 65504 — lub skorzystać z przycisków wartości specjalnych: ±0, ±Infinity, NaN, najmniejsza subnormalna i największa skończona. Konwersja odbywa się podczas pisania.
- 3
Odczytanie kolorowego układu bitów
Bit znaku, pole wykładnika i mantysa są wyróżnione różnymi kolorami, a tabela podziału na pola pokazuje surowe bity, arytmetykę przesunięcia i niejawny bit wiodący.
- 4
Sprawdzenie dokładnej wartości i błędu
Panel dokładności wypisuje wartość faktycznie przechowywaną — każdą cyfrę, policzoną dokładnie — obok błędu zaokrąglenia względem wpisanej liczby, a także poprzednią i następną wartość reprezentowalną oraz odstęp ULP.
- 5
Przełączanie bitów, wklejanie hex, kopiowanie wyników
Kliknięcie dowolnego bitu odwraca jego wartość; można też wkleić zapis hex (3DCCCCCD) lub ciąg binarny, aby zdekodować je z powrotem na liczbę dziesiętną. Do skopiowania są: hex, zapis binarny, dokładna wartość oraz link odtwarzający dokładnie ten sam wzorzec bitowy.
Najczęstsze błędy zmiennoprzecinkowe
Ufanie wartości wypisanej zamiast przechowywanej
Języki wypisują floaty zaokrąglone do najkrótszego ciągu, który po ponownym sparsowaniu daje te same bity, więc 0.1 wygląda czysto, choć przechowywana wartość taka nie jest. O precyzji należy sądzić po dokładnym rozwinięciu, a nie po tym, co pokazuje print().
print(0.1) # 0.1 — wygląda dokładnie, ale nie jest
0.1 przechowywane (FP64) = 0.1000000000000000055511151231257827021181583404541015625
Porównywanie floatów przez dokładną równość
0.1 + 0.2 ląduje na wzorcu bitowym 0x3FD3333333333334, podczas gdy literał 0.3 to 0x3FD3333333333333 — jeden ULP różnicy, więc == daje fałsz, mimo że oba wypisują się jako wartości bliskie 0.3.
if (0.1 + 0.2 === 0.3) { … } // nigdy się nie wykona if (Math.abs(a - b) < 1e-9) { … } // tolerancja dobrana do danych Kwantyzacja do FP16 bez sprawdzenia zakresu
Największa skończona wartość FP16 to 65504. Wszystko powyżej staje się Infinity, a gdy Infinity raz wejdzie do obliczeń, propaguje się dalej. Przed rzutowaniem w dół warto sprawdzić maksima — albo użyć bfloat16, który zachowuje zakres FP32.
fp16(65520) → Infinity (0x7C00) — ciche przepełnienie
bf16(65520) → wartość skończona (bfloat16 zachowuje 8 bitów wykładnika)
Testowanie NaN przez równość
NaN to jedyna wartość, która nie jest równa samej sobie — celowo, aby nieudane obliczenie nie mogło udawać prawdziwej liczby. Zamiast == należy używać sprawdzenia isNaN danego języka i pamiętać, że istnieją miliony różnych wzorców bitowych NaN.
if (x === NaN) { … } // zawsze fałsz, nawet gdy x JEST NaN if (Number.isNaN(x)) { … } // poprawny test Co można zrobić z konwerterem IEEE 754
- Debugowanie serializowanych danych binarnych
- Wystarczy wkleić hex znaleziony w przechwyconym ruchu sieciowym, buforze GPU, zrzucie rejestrów lub formacie pliku i zdekodować go do dokładnej wartości dziesiętnej — albo pójść w drugą stronę, aby przygotować dane testowe. Uwaga o kolejności bajtów: pokazywany hex to wzorzec bitowy big-endian; jeśli zrzut jest little-endian, przed wklejeniem należy odwrócić kolejność bajtów.
- Zrozumienie kwantyzacji ML
- Można sprawdzić, czy wartości przetrwają pułap 65504 formatu FP16, porównać cyfra po cyfrze utratę precyzji FP16 i bfloat16 oraz przyjrzeć się zakresowi subnormalnemu, w którym gradienty ulegają niedomiarowi.
- Wyjaśnienie błędu zmiennoprzecinkowego
- Gdy ktoś z zespołu pyta, dlaczego dwie „równe” liczby się różnią, wystarczy wysłać permalink pokazujący oba wzorce bitowe i dokładne przechowywane wartości — spór rozstrzyga się sam. Przy dłuższych zrzutach warto sięgnąć po narzędzie porównywania tekstu.
- Nauka i nauczanie kodowania liczb
- Zajęcia z architektury komputerów stają się konkretne, gdy studenci mogą klikać bity wykładnika i obserwować, jak aktualizuje się arytmetyka przesunięcia. Tabela podziału na pola odzwierciedla sposób, w jaki format rysują podręczniki.
- Dekodowanie rejestrów embedded i przemysłowych
- Ładunki Modbus, CAN i czujników rutynowo przenoszą wartości FP32 jako surowe słowa hex. Wystarczy wkleić takie słowo, aby odczytać wielkość fizyczną bez pisania jednorazowego skryptu.
Formaty IEEE 754 i wartości specjalne
- Cztery formaty binarne w pigułce
- binary16 (FP16): 1 bit znaku + 5 bitów wykładnika + 10 bitów mantysy, bias 15, maks. 65504, ~3,3 cyfry dziesiętnej. bfloat16: 1 + 8 + 7, bias 127, maks. ≈ 3,39 × 10³⁸, ~2,3 cyfry. binary32 (FP32): 1 + 8 + 23, bias 127, maks. ≈ 3,40 × 10³⁸, ~7,2 cyfry. binary64 (FP64): 1 + 11 + 52, bias 1023, maks. ≈ 1,80 × 10³⁰⁸, ~15,9 cyfry. Wzór jest stały: bity wykładnika kupują zakres, bity mantysy — precyzję, a bfloat16 świadomie oddaje całą precyzję za zakres FP32.
- Jak składana jest wartość
- Liczba normalna dekoduje się jako (−1)^znak × 1.mantysa × 2^(wykładnik − bias). Wiodąca jedynka jest niejawna — nie jest przechowywana, dlatego 23-bitowe pole mantysy daje 24 bity precyzji. Przechowywany wykładnik to wykładnik rzeczywisty plus przesunięcie (127 w FP32), więc 2⁰ zapisuje się jako 01111111. Tabela podziału na pola w tym narzędziu pokazuje każdy krok tej arytmetyki dla bieżącej wartości.
- Wartości specjalne: zarezerwowane wzorce wykładnika
- Wykładnik z samych jedynek przy zerowej mantysie to ±Infinity; przy dowolnej niezerowej mantysie to NaN (kanoniczny cichy NaN ustawia najstarszy bit mantysy). Wykładnik z samych zer przy zerowej mantysie to ±0; przy niezerowej — liczba subnormalna, dekodowana jako 0.mantysa × 2^(1 − bias), bez niejawnej wiodącej jedynki. Reguły są identyczne we wszystkich czterech formatach, dlatego te same przyciski działają w każdym z nich.
- Zaokrąglanie: do najbliższej, remisy do parzystej
- Gdy wartość wypada między dwiema liczbami reprezentowalnymi, domyślny tryb IEEE 754 zaokrągla do bliższej; przy dokładnym remisie wybiera tę, której ostatni bit mantysy to 0 (ties to even), co zapobiega systematycznemu dryfowi. Ten konwerter stosuje dokładnie tę regułę przy zwężaniu wpisanej liczby dziesiętnej do formatu docelowego, a panel błędu pokazuje wynikową różnicę ze znakiem w postaci dokładnej.
- ULP: gęstość siatki floatów
- Wartości reprezentowalne nie są rozłożone równomiernie — odstęp między sąsiadami (jedna jednostka na ostatnim miejscu) podwaja się przy każdej potędze dwójki. W okolicy 1.0 ULP double wynosi 2⁻⁵² ≈ 2,22 × 10⁻¹⁶; w okolicy 2⁵³ ULP sięga 1.0 i liczby całkowite zaczynają być pomijane. Panel sąsiadów wypisuje bieżący ULP dokładnie — to uczciwa odpowiedź na pytanie „jaka precyzja jest tu naprawdę dostępna?”.
Dobre praktyki pracy z liczbami zmiennoprzecinkowymi
- Porównania bez operatora ==
- Po dowolnej operacji arytmetycznej dwa matematycznie równe wyrażenia mogą znaleźć się o jeden ULP od siebie. Porównywać należy względem tolerancji dobranej do rzędu wielkości danych — albo liczyć ULP-y między wzorcami bitowymi, które to narzędzie pozwala obejrzeć bezpośrednio.
- Pieniądze poza binarnymi floatami
- Żadna siatka potęg dwójki nie zawiera dokładnie 0.10, więc waluta trzymana we floatach kumuluje widoczne błędy. Lepiej używać całkowitych groszy lub typu dziesiętnego; panel dokładnej przechowywanej wartości stanowi tu stały dowód dlaczego.
- Format 16-bitowy dobierany zakresem, nie przyzwyczajeniem
- Jeśli wartości mogą przekroczyć 65504 — funkcje straty, gradienty, skoki w symulacjach fizycznych — FP16 przepełni się do Infinity tam, gdzie bfloat16 płynie dalej. Jeśli wszystko jest znormalizowane do wąskiego pasma, dodatkowe bity mantysy FP16 dają wyraźnie lepszą precyzję.
- Pułapka podwójnego zaokrąglenia przy zwężaniu
- Konwersja dziesiętna → double → half może w rzadkich przypadkach granicznych wylądować o jeden ULP dalej niż konwersja dziesiętna → half wykonana bezpośrednio. To narzędzie zaokrągla wpisaną liczbę dziesiętną do formatu docelowego w jednym kroku, więc pokazany wynik to uczciwa odpowiedź IEEE 754.
- Liczby całkowite psują się powyżej 2⁵³
- Double przechowuje dokładnie każdą liczbę całkowitą do 2⁵³, a potem zaczyna pomijać — 2⁵³ + 1 jest niereprezentowalne. Przy identyfikatorach lub licznikach zbliżających się do tej skali lepiej używać 64-bitowych liczb całkowitych albo ciągów znaków, a podejrzane wartości sprawdzać tutaj na poziomie bitów.
Najczęściej zadawane pytania o konwerter IEEE 754
Dlaczego 0.1 + 0.2 nie równa się 0.3?
Czym jest IEEE 754?
Czym różni się FP16 od bfloat16?
Czym są liczby subnormalne (zdenormalizowane)?
Float czy double — czego używać?
Jak ręcznie przekonwertować float na hex?
Czy podczas korzystania z konwertera dane są dokądś wysyłane?
Powiązane narzędzia
Zobacz wszystkie narzędzia →Konwerter systemów liczbowych — binary, hex, decimal i octal
Narzędzia konwersji
Konwertuj między systemami binarnym, szesnastkowym, dziesiętnym i ósemkowym (2–36) w czasie rzeczywistym. Bezpłatnie i prywatnie — w przeglądarce.
Konwerter kolorów — HEX, RGB, HSL i OKLCH
Narzędzia konwersji
Konwertuj HEX na RGB, HSL, OKLCH, OKLAB i CMYK w przeglądarce — skopiuj dowolny format jednym kliknięciem. Darmowy, bez rejestracji, kolory nigdy nie opuszczają strony.
Konwerter HEX na CMYK
Narzędzia konwersji
Konwertuj kolory HEX na CMYK w przeglądarce. Naiwne przybliżenie oparte na sRGB do podglądu druku. Bezpłatny, bez rejestracji, kolory zostają lokalnie.
Konwerter HEX na HSL
Narzędzia konwersji
Konwertuj dowolny kolor HEX na HSL w przeglądarce — obsługa 3-, 6- i 8-cyfrowego HEX z kanałem alfa. Bezpłatny, natychmiastowy, bez rejestracji, kolory nigdy nie opuszczają strony.
Konwerter HEX na OKLCH
Narzędzia konwersji
Konwertuj HEX na OKLCH pod tokeny projektowe Tailwind v4. Na żywo, percepcyjnie jednorodne wyjście z ostrzeżeniami o gamucie Display P3. Darmowy, tylko w przeglądarce.
Konwerter HEX na RGB
Narzędzia konwersji
Konwertuj dowolny kod HEX na RGB w przeglądarce — obsługa 3-, 6- i 8-cyfrowego HEX z kanałem alfa. Bezpłatny, natychmiastowy, bez rejestracji, kolory nigdy nie opuszczają strony.