Skip to content

Конвертер чисел с плавающей запятой IEEE 754

Конвертация десятичных чисел в двоичный и hex-формат IEEE 754 онлайн — половинная, одинарная, двойная точность и bfloat16. Точное хранимое значение, ошибка округления и раскладка битов. 100% в вашем браузере.

Без отслеживания Работает в браузере Бесплатно
Всё выполняется локально в вашем браузере — введённые значения никогда не покидают это устройство.
Формат
Специальные значения
Раскладка битов — щёлкните любой бит, чтобы инвертировать его
Знак Порядок Мантисса
Разбор полей
Знак
Порядок
Мантисса
Хранимое значение и ошибка округления
Вы ввели
Фактически хранится
Ошибка округления
Соседние представимые значения
Предыдущее
Следующее
ULP (размер зазора)
Параметры форматов IEEE 754 с одного взгляда
Формат Всего бит Знак Порядок Мантисса Смещение Макс. конечное значение Десятичные цифры
binary16 (FP16)1615101565504~3.3
bfloat1616187127≈3.39×10³⁸~2.3
binary32 (FP32)321823127≈3.40×10³⁸~7.2
binary64 (FP64)64111521023≈1.80×10³⁰⁸~15.9
Проверено на численную точность по определениям форматов IEEE 754-2019; каждое значение в примерах верифицировано точной длинной арифметикой — Команда инженеров Go-Tools · Jul 16, 2026

Что такое плавающая запятая IEEE 754?

IEEE 754 — стандарт, определяющий, как компьютеры хранят вещественные числа в двоичном виде. Каждое значение упаковано в три поля: знаковый бит, порядок (экспонента, хранимая со смещением, чтобы представлять и большие, и крошечные величины) и мантисса со значащими цифрами. Его использует почти каждый CPU, GPU и язык программирования — поэтому одни и те же сюрпризы округления появляются в JavaScript, Python, C и SQL одинаково.

Ключевая идея в том, что двоичная плавающая запятая может представлять только числа вида m × 2ⁿ. Десятичные дроби вроде 0.1 в двоичной системе — бесконечные периодические дроби — 0.000110011001100… — поэтому формат хранит ближайшего представимого соседа. В одинарной точности этот сосед — 0.100000001490116119384765625; в двойной — 0.1000000000000000055511151231257827021181583404541015625. Ни то ни другое не равно 0.1. Все последующие странности — 0.1 + 0.2 ≠ 0.3, уплывающие суммы, проваливающиеся проверки равенства — следуют из этого единственного факта, и этот конвертер делает его видимым, печатая точное хранимое значение вместо округлённого обратно приближения.

Стандарт также резервирует битовые паттерны под специальные значения. Порядок из одних единиц кодирует ±Infinity (мантисса ноль) или NaN (мантисса не ноль); порядок из одних нулей кодирует знаковый ноль (мантисса ноль) или субнормальные числа (мантисса не ноль), которые заполняют разрыв исчезновения порядка рядом с нулём при сниженной точности. Четыре формата этого инструмента — binary16/FP16, bfloat16, binary32/FP32, binary64/FP64 — различаются лишь тем, сколько битов отдано каждому полю: больше битов порядка — больше диапазон, больше битов мантиссы — больше точность. bfloat16, любимец машинного обучения, — это просто FP32 с отрезанными нижними 16 битами мантиссы: тот же диапазон, куда более грубая точность.

Полезная ментальная модель: представимые float образуют сетку на числовой прямой, шаг которой — единица в последнем разряде, или ULP — удваивается на каждой степени двойки. Около 1.0 шаг сетки double составляет примерно 2.22 × 10⁻¹⁶; около 2⁵³ он равен целой единице — вот почему double не может надёжно считать дальше 2⁵³. Панель соседей в этом инструменте показывает эту сетку напрямую: предыдущее и следующее представимые значения вокруг введённого числа с точным зазором между ними.

// 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

Ключевые возможности

Четыре формата, один вид

Половинная (FP16), bfloat16, одинарная (FP32) и двойная (FP64) точность — переключение одним щелчком пересчитывает всю страницу, поэтому сравнить, как одно и то же число ложится в каждый формат, — дело секунд.

Кликабельная сетка битов

Каждый бит — кнопка. Инвертируйте знак, подвиньте порядок или троньте бит мантиссы — десятичное, hex- и двоичное представления обновятся мгновенно; самый быстрый способ выработать интуицию кодирования.

Точное хранимое значение, а не приближение

Инструмент вычисляет полное десятичное разложение хранимых битов точной длинной арифметикой — все 55 цифр для 0.1 в double — плюс точную ошибку округления со знаком относительно введённого.

Соседи и ULP

Смотрите предыдущее и следующее представимые значения вокруг текущего числа и точный зазор (ULP) между ними — шаг сетки, определяющий, сколько точности у вас реально есть на данной величине.

Специальные значения в один щелчок

Чипы загружают ±0, ±Infinity, NaN, наименьшее субнормальное и наибольшее конечное значение выбранного формата, а бейдж классификации называет, что кодирует текущий битовый паттерн.

Постоянные ссылки — без отправки данных

«Копировать ссылку» кодирует формат и точный битовый паттерн в URL — идеально для баг-репортов, код-ревью и обучения. Всё выполняется в браузере; ничего из введённого не покидает страницу.

Примеры конвертации IEEE 754

0.1 в одинарной точности — классическая ошибка округления

0.1
0x3DCCCCCD — фактически хранится как 0.100000001490116119384765625

Десятичное 0.1 не имеет конечного двоичного представления, поэтому IEEE 754 хранит ближайшее представимое значение. В одинарной точности (FP32) это 0x3DCCCCCD, то есть ровно 0.100000001490116119384765625 — примерно на 1.49 × 10⁻⁹ больше. Инструмент показывает это точное хранимое значение и точную ошибку, цифра за цифрой, а не округлённое «0.1», которое печатает в ответ ваш язык программирования. Один этот пример объясняет большинство сюрпризов плавающей запятой, включая то, почему 0.1 + 0.2 не равно 0.3.

Float в hex: 3.14159 в FP32

3.14159
0x40490FD0

Введите 3.14159 при выбранной одинарной точности (FP32) — поле hex покажет 0x40490FD0: знак 0, смещённый порядок 128 (то есть 2¹), мантисса 0x490FD0. Фактически хранится 3.141590118408203125 — на волосок больше введённого. Hex-форма встречается в сетевых дампах, буферах GPU, представлениях регистров и сериализованных двоичных файлах, а конвертация работает в обе стороны: вставьте 40490FD0 в поле hex, чтобы декодировать обратно.

Максимум FP16: 65504 — предел половинной точности

65504
0x7BFF — наибольшее конечное значение FP16

У половинной точности всего 5 бит порядка и 10 бит мантиссы, поэтому её наибольшее конечное значение — 65504 (0x7BFF). Введите 65520 или больше — результат округлится до Infinity (0x7C00), реальная опасность при квантовании моделей машинного обучения в FP16. Переключитесь на bfloat16 — и те же 65520 легко помещаются, потому что bfloat16 сохраняет 8 бит порядка FP32 (диапазон), жертвуя битами мантиссы (точностью). Именно этот компромисс объясняет, почему обучение ML предпочитает bfloat16, а компактное хранение — FP16.

−0 и +0: два разных битовых паттерна, одно значение

-0
0x80000000 (FP32), тогда как +0 — это 0x00000000

В IEEE 754 есть знаковый ноль: у −0 установлен только знаковый бит (0x80000000 в FP32), а +0 — все нули. Они равны при сравнении в любом языке, однако 1/−0 даёт −Infinity, а 1/+0 — +Infinity, так что разница наблюдаема. Щёлкните знаковый бит в инструменте, чтобы переключаться между ними: бейдж классификации останется на «Ноль», а hex изменится — иллюстрация в один щелчок того, почему битовое равенство и числовое равенство — разные вещи.

Как конвертировать числа с плавающей запятой IEEE 754

  1. 1

    Выберите формат с плавающей запятой

    Одинарная точность (FP32) выбрана заранее. Переключитесь на двойную (FP64) для чисел в стиле JavaScript/Python или на половинную (FP16) и bfloat16 — 16-битные форматы машинного обучения и графики.

  2. 2

    Введите десятичное число

    Введите любое значение — 0.1, -2.5e3, 65504 — или используйте чипы специальных значений для ±0, ±Infinity, NaN, наименьшего субнормального и наибольшего конечного. Конвертация происходит по мере ввода.

  3. 3

    Прочитайте цветную раскладку битов

    Знаковый бит, поле порядка и мантисса подсвечены разными цветами, а таблица разбора полей показывает сырые биты, арифметику смещения и неявный ведущий бит.

  4. 4

    Проверьте точное хранимое значение и ошибку

    Панель точности печатает фактически хранимое значение — каждую цифру, вычисленную точно, — рядом с ошибкой округления относительно введённого, плюс предыдущий и следующий представимые соседи и зазор ULP.

  5. 5

    Инвертируйте биты, вставляйте hex, копируйте результаты

    Щёлкните любой бит, чтобы инвертировать его, или вставьте hex (3DCCCCCD) и двоичные строки, чтобы декодировать их обратно в десятичное. Копируйте hex, двоичное, точное значение или ссылку, воспроизводящую точный битовый паттерн.

Частые ошибки с плавающей запятой

Доверять напечатанному значению вместо хранимого

Языки печатают float, округлённый до кратчайшей строки, которая восстанавливается обратно, поэтому 0.1 выглядит чистым, хотя хранимое значение таким не является. Судите о точности по точному разложению, а не по выводу print().

✗ Неверно
print(0.1)  # 0.1 — выглядит точным, но это не так
✓ Верно
0.1 хранится (FP64) = 0.1000000000000000055511151231257827021181583404541015625

Сравнивать float на точное равенство

0.1 + 0.2 попадает на битовый паттерн 0x3FD3333333333334, а литерал 0.3 — это 0x3FD3333333333333 — разница в один ULP, поэтому == ложно, хотя оба печатаются как значения около 0.3.

✗ Неверно
if (0.1 + 0.2 === 0.3) { … }   // никогда не выполнится
✓ Верно
if (Math.abs(a - b) < 1e-9) { … }   // допуск по масштабу ваших данных

Квантовать в FP16 без проверки диапазона

Наибольшее конечное значение FP16 — 65504. Всё, что больше, становится Infinity, а попавшая в вычисление Infinity распространяется дальше. Проверяйте максимумы перед понижающим приведением — или используйте bfloat16, сохраняющий диапазон FP32.

✗ Неверно
fp16(65520)   → Infinity (0x7C00) — тихое переполнение
✓ Верно
bf16(65520)   → конечное (bfloat16 сохраняет 8 бит порядка)

Проверять NaN через равенство

NaN — единственное значение, не равное самому себе; это сделано намеренно, чтобы провалившееся вычисление не могло притвориться настоящим числом. Используйте проверку isNaN вашего языка вместо == и помните: различных битовых паттернов NaN — миллионы.

✗ Неверно
if (x === NaN) { … }        // всегда ложно, даже когда x — это NaN
✓ Верно
if (Number.isNaN(x)) { … }  // правильная проверка

Что можно делать с конвертером IEEE 754

Отладка сериализованных двоичных данных
Вставьте hex из сетевого дампа, буфера GPU, дампа регистров или файлового формата и декодируйте его в точное десятичное значение — или идите в обратную сторону, чтобы готовить тестовые фикстуры. Про порядок байтов: показанный hex — это big-endian битовый паттерн; если ваш дамп little-endian, перед вставкой поменяйте порядок байтов на обратный.
Понимание квантования в ML
Проверьте, переживут ли ваши значения потолок FP16 в 65504, сравните потерю точности FP16 и bfloat16 цифра за цифрой и исследуйте субнормальный диапазон, где градиенты исчезают.
Объяснение бага плавающей запятой
Когда коллега спрашивает, почему два «равных» числа различаются, отправьте постоянную ссылку с обоими битовыми паттернами и точными хранимыми значениями — спор решится сам. Для длинных дампов подключите инструмент сравнения текста.
Изучение и преподавание кодирования
Курс компьютерной архитектуры становится осязаемым, когда студенты могут щёлкать биты порядка и видеть, как обновляется арифметика смещения. Таблица разбора полей повторяет то, как формат рисуют в учебниках.
Декодирование встраиваемых и промышленных регистров
Полезные нагрузки Modbus, CAN и датчиков сплошь и рядом несут значения FP32 сырыми hex-словами. Вставьте слово сюда и прочитайте физическую величину без одноразового скрипта.

Форматы и специальные значения IEEE 754

Четыре двоичных формата с одного взгляда
binary16 (FP16): 1 знаковый + 5 бит порядка + 10 бит мантиссы, смещение 15, максимум 65504, ~3.3 десятичной цифры. bfloat16: 1 + 8 + 7, смещение 127, максимум ≈ 3.39 × 10³⁸, ~2.3 цифры. binary32 (FP32): 1 + 8 + 23, смещение 127, максимум ≈ 3.40 × 10³⁸, ~7.2 цифры. binary64 (FP64): 1 + 11 + 52, смещение 1023, максимум ≈ 1.80 × 10³⁰⁸, ~15.9 цифры. Закономерность: биты порядка покупают диапазон, биты мантиссы покупают точность, а bfloat16 сознательно меняет всю свою точность на диапазон FP32.
Как собирается значение
Нормальное число декодируется как (−1)^знак × 1.мантисса × 2^(порядок − смещение). Ведущая единица неявная — она не хранится, поэтому 23-битное поле мантиссы даёт 24 бита точности. Хранимый порядок — это истинный порядок плюс смещение (127 в FP32), поэтому 2⁰ хранится как 01111111. Таблица разбора полей в этом инструменте показывает каждый шаг этой арифметики для текущего значения.
Специальные значения: зарезервированные паттерны порядка
Порядок из одних единиц при нулевой мантиссе — ±Infinity; при любой ненулевой мантиссе — NaN (канонический тихий NaN устанавливает старший бит мантиссы). Порядок из одних нулей при нулевой мантиссе — ±0; при ненулевой — субнормальное число, декодируемое как 0.мантисса × 2^(1 − смещение) — без неявной ведущей единицы. Эти правила одинаковы во всех четырёх форматах, поэтому одни и те же чипы работают в каждом.
Округление: к ближайшему, при равенстве — к чётному
Когда значение попадает между двумя представимыми числами, режим IEEE 754 по умолчанию округляет к более близкому; при точном равенстве выбирается то, у которого последний бит мантиссы равен 0 (к чётному), что предотвращает систематический дрейф. Этот конвертер применяет ровно это правило при сужении десятичного ввода в целевой формат, а панель ошибки точно показывает получившуюся разность со знаком.
ULP: шаг сетки float
Представимые float распределены неравномерно — зазор между соседями (единица в последнем разряде) удваивается на каждой степени двойки. Около 1.0 ULP double равен 2⁻⁵² ≈ 2.22 × 10⁻¹⁶; около 2⁵³ ULP достигает 1.0, и целые начинают пропускаться. Панель соседей печатает текущий ULP точно — это честный ответ на вопрос «насколько точное здесь моё число?».

Лучшие практики работы с плавающей запятой

Никогда не сравнивайте float через ==
После любой арифметики два математически равных выражения могут отстоять друг от друга на один ULP. Сравнивайте с допуском, соответствующим вашим величинам, — или считайте ULP между битовыми паттернами, которые этот инструмент позволяет рассмотреть напрямую.
Держите деньги подальше от двоичных float
Ни одна сетка степеней двойки не содержит 0.10 точно, поэтому валюта во float накапливает видимые ошибки. Используйте целые (копейки) или десятичный тип; панель точного хранимого значения здесь — наглядное тому доказательство.
Выбирайте 16-битный формат по диапазону, а не по привычке
Если значения могут превысить 65504 — потери, градиенты, всплески в физике — FP16 переполнится до Infinity там, где bfloat16 пройдёт спокойно. Если же всё нормализовано в узкую полосу, дополнительные биты мантиссы FP16 дают заметно лучшую точность.
Помните о ловушке двойного округления при сужении
Конвертация десятичное → double → half в редких пограничных случаях может оказаться на один ULP в стороне от прямой конвертации десятичное → half. Этот инструмент округляет десятичный ввод в целевой формат за один шаг, поэтому вы видите честный ответ IEEE 754.
Ожидайте, что целые сломаются выше 2⁵³
Double хранит каждое целое до 2⁵³ точно, а затем начинает пропускать — 2⁵³ + 1 непредставимо. Если вы работаете с ID или счётчиками такого масштаба, используйте 64-битные целые или строки, а подозрительные значения проверяйте здесь на уровне битов.

Часто задаваемые вопросы об IEEE 754

Почему 0.1 + 0.2 не равно 0.3?
Потому что ни одно из трёх чисел не существует в двоичной плавающей запятой. Double хранит 0.1 как ровно 0.1000000000000000055511151231257827021181583404541015625, а 0.2 — с похожим крошечным избытком; их сложение даёт 0.3000000000000000444089209850062616169452667236328125 (биты 0x3FD3333333333334), тогда как литерал 0.3 округляется до 0.299999999999999988897769753748434595763683319091796875 (биты 0x3FD3333333333333). Сумма оказывается на один представимый шаг выше литерала — два разных битовых паттерна, — поэтому 0.1 + 0.2 == 0.3 ложно в каждом языке с IEEE 754: JavaScript, Python, Java, C, Rust, Go. Введите 0.1 в этот конвертер и прочитайте точное хранимое значение, чтобы увидеть первопричину своими глазами.
Что такое IEEE 754?
IEEE 754 — технический стандарт двоичной арифметики с плавающей запятой, используемый практически каждым современным CPU, GPU и языком программирования. Он определяет, как число упаковывается в биты — знаковый бит, поле порядка (экспоненты) и мантисса (значащая часть), — плюс правила округления и специальные значения Infinity, NaN, знаковый ноль и субнормальные числа. На практике вы встретите форматы binary32 (float, FP32), binary64 (double, FP64), binary16 (half, FP16) и родственное усечение bfloat16, применяемое в машинном обучении. Этот конвертер показывает все четыре на уровне битов.
В чём разница между FP16 и bfloat16?
Оба формата 16-битные, но делят биты по-разному. FP16 (IEEE binary16) использует 5 бит порядка и 10 бит мантиссы: больше точности, но крошечный диапазон — наибольшее конечное значение 65504, поэтому переполнение до Infinity — постоянная опасность. bfloat16 сохраняет 8 бит порядка FP32 и лишь 7 бит мантиссы: полный диапазон float ±3.4 × 10³⁸ при куда более грубой точности. Именно поэтому в обучении ML, где градиенты могут выстреливать далеко за 65504, стандартом стал bfloat16, а FP16 подходит для хранения и инференса, где значения укрощены. Сравните их здесь: введите 0.1 и переключите форматы — FP16 хранит 0.0999755859375 (0x2E66), bfloat16 хранит 0.10009765625 (0x3DCD).
Что такое субнормальные (денормализованные) числа?
Когда поле порядка состоит из одних нулей, IEEE 754 отбрасывает неявную ведущую единицу и позволяет мантиссе постепенно убывать к нулю — это субнормальные (устаревший термин: денормализованные) числа. Они заполняют разрыв между нулём и наименьшим нормальным числом, поэтому разность двух неравных float никогда не округляется до нуля (постепенное исчезновение порядка). Цена — сниженная точность и на многих CPU более медленная арифметика. В FP16 наименьшее субнормальное — 2⁻²⁴ = 0.000000059604644775390625; нажмите чип «Мин. субнормальное» в любом формате, чтобы рассмотреть его битовый паттерн — биты порядка все нули, мантисса 0…001.
Что использовать: float или double?
По умолчанию берите double (FP64), если нет измеренной причины поступить иначе. Double несёт примерно 15–16 значащих десятичных цифр против примерно 7 у float, а большинство языков (числа JavaScript, float в Python) и так работают только с double. Выбирайте float (FP32), когда доминирует пропускная способность памяти или объём хранения — большие массивы, конвейеры GPU, графика — и вы убедились, что 7 цифр достаточно. Для денег используйте целые (копейки) или десятичный тип: ни один двоичный формат не хранит 0.1 точно, что и демонстрирует панель хранимого значения этого инструмента. Если нужно исследовать целочисленные системы счисления, см. конвертер систем счисления.
Как перевести float в hex вручную?
Возьмите знак (0 для положительного, 1 для отрицательного). Запишите модуль числа в двоичной системе и нормализуйте к виду 1.xxx × 2ⁿ. Прибавьте к n смещение формата (127 для FP32, 1023 для FP64) и запишите результат в биты порядка. Отбросьте ведущую единицу и оставьте следующие 23 (или 52) бита дроби как мантиссу, округляя до ближайшего чётного на месте отсечения. Соедините знак, порядок и мантиссу и сгруппируйте каждые 4 бита в одну hex-цифру. Для 3.14159 в FP32 это даёт 0 | 10000000 | 10010010000111111010000 → 0x40490FD0 — или пропустите арифметику и позвольте этому конвертеру наглядно показать каждый шаг.
Загружаются ли мои данные при использовании этого конвертера?
Нет. Каждая конвертация выполняется локально в вашем браузере на чистом JavaScript — арифметика DataView и BigInt, без обращений к серверу и без сторонних библиотек. Можете открыть инструменты разработчика и убедиться, что панель «Сеть» молчит, пока вы печатаете, или полностью отключиться от интернета и продолжать конвертировать. Кнопка «Копировать ссылку» кодирует битовый паттерн во фрагмент URL, который точно так же никогда не отправляется ни на какой сервер.

Похожие инструменты

Все инструменты →

Конвертер систем счисления — bin, hex, dec, oct

Конвертеры

Конвертация между системами счисления — двоичной, hex, десятичной, восьмеричной и любой базой 2-36 мгновенно. Бесплатно, приватно — вся обработка в браузере.

Конвертер цветов — HEX, RGB, HSL и OKLCH

Конвертеры

Конвертируйте HEX в RGB, HSL, OKLCH, OKLAB и CMYK прямо в браузере — копируйте любой формат в один клик. Бесплатно, без регистрации, ваши цвета никогда не покидают страницу.

Конвертер HEX в CMYK

Конвертеры

Конвертируйте HEX-цвета в CMYK прямо в браузере. Наивное приближение на основе sRGB для предпросмотра печати. Бесплатно, без регистрации, ваши цвета остаются локально.

Конвертер HEX в HSL

Конвертеры

Конвертируйте любой HEX-цвет в HSL прямо в браузере — поддерживаются 3-значные, 6-значные и 8-значные HEX с альфой. Бесплатно, мгновенно, без регистрации, ваши цвета никогда не покидают страницу.

Конвертер HEX в OKLCH

Конвертеры

Конвертируйте HEX в OKLCH для токенов дизайна Tailwind v4. Живой перцептивно-равномерный вывод с предупреждениями цветового охвата Display P3. Бесплатно, только в браузере.

Конвертер HEX в RGB

Конвертеры

Конвертируйте любой HEX-код цвета в RGB прямо в браузере — поддерживаются 3-значные, 6-значные и 8-значные HEX с альфой. Бесплатно, мгновенно, без регистрации, ваши цвета никогда не покидают страницу.