Command Palette

Search for a command to run...

Конвертер IEEE 754: посмотрите, как на самом деле хранятся поплавки

Конвертер IEEE 754: посмотрите, как на самом деле хранятся поплавки

T
Toolz Team
|Aug 23, 2026|16 Мин. читать

Часть коллекции бинарный и гекс

Первый раз а 0.1 + 0.2 === 0.3 баг укусил меня в производстве, я сделал то, что делает большинство разработчиков: я искал, нашел & quot; точка плавания странная, & quot; и пошел дальше. это было годы, прежде чем я действительно посмотрел биты и понял почему. как только я сделал, целая категория числовых ошибок перестала быть загадочной. это руководство проходит через то, что IEEE 754 конвертер показывает вам, используя Преобразователь IEEE 754 на Toolz.dev, и почему смотреть на знак, показатель степени и мантиссу - это самый быстрый способ построить настоящую интуицию о том, как компьютеры хранят десятичные дроби.

TL;DR: Компьютеры хранят числа с плавающей запятой в виде знака, степени двойки и дробной мантиссы, следуя стандарту IEEE 754. Преобразователь IEEE 754 кодирует десятичную дробь, подобную 3.14159, в эти точные биты и декодирует биты обратно в значение.The Преобразователь IEEE 754 делает и то, и другое, для одинарной и двойной точности, полностью в вашем браузере, с выбитыми знаками, экспонентами и мантиссой.

Что такое IEEE 754?

IEEE 754 - это стандарт, впервые опубликованный в 1985 году и пересмотренный как IEEE 754-2019это определяет, как компьютеры представляют числа с плавающей запятой в двоичном формате. Почти каждый процессор, графический процессор и язык программирования следуют за ним, поэтому a double ведет себя так же в C, Java, Python, и JavaScript Когда люди говорят & quot;плавающая точка, & quot; они почти всегда имеют в виду двоичную плавающую точку IEEE 754.

Основная идея заключается в том, что число хранится в трех частях. есть знаковый бит, который говорит положительное или отрицательное. есть показатель степени, который масштабирует значение на степень два. И есть мантисса, также называемая дробью или мантиссой, которая удерживает точные цифры. вместе взятые, нормальное число является знаком, умноженным на 1.мантисса, умноженным на 2, к показателю степени. Это научная запись, в основании два, упакованная в фиксированное количество битов.

Два формата, которые вы встречаете ежедневно, являются одинарной точностью, называется binary32, и двойной точностью, называется binary64.Одиночный использует 1 знаковый бит, 8 битов экспоненты, и 23 бита мантиссы, для 32 битов всего Двойной использует 1 знаковый бит, 11 битов экспоненты, и 52 бита мантиссы, для 64 битов всего Двойной является типом с плавающей запятой по умолчанию в большинстве языков; одиночный распространен на графических процессорах и в коде, чувствительном к памяти.

Что на самом деле делает преобразователь IEEE 754?

Преобразователь IEEE 754 принимает число и показывает вам его точный битовый шаблон, разбитый на эти три поля, вместе с шестнадцатеричной формой и значением, считанным обратно из битов. Он работает в обоих направлениях: введите десятичную дробь, чтобы закодировать ее, или вставьте двоичный или шестнадцатеричный битовый шаблон, чтобы декодировать его обратно в число, которое он представляет.

На Toolz.dev рабочий процесс короткий. выберите одинарную или двойную точность. выберите, является ли ваш вход десятичным числом, шестнадцатеричным битовым шаблоном или двоичным битовым шаблоном. Введите значение. инструмент показывает бит знака, поле показателя степени, мантиссу, полные биты, шестнадцатеричный код, как смещенный, так и несмещенный показатель степени, а также точное сохраненное значение. каждое поле имеет кнопку копирования.

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

Почему 0,1 плюс 0,2 не равняется 0,3?

Это канонический пример, и преобразователь делает его конкретным. значение 0.1 не может быть представлено точно в двоичной плавающей точке, по той же причине 1/3 не может быть записано точно в десятичной системе.В базе десять, 1/3 это 0.3333... навсегда. Во второй базе 0.1 - повторяющаяся дробь, которая никогда не заканчивается, поэтому ее необходимо округлить, чтобы она поместилась в 52 бита мантиссы.

Расшифруйте двойное значение для 0,1, и значение, которое на самом деле имеют биты, составит 0,1000000000000551151231257827021181583404541015625. Двойной для 0,2 также слишком велик. Добавьте два округленных значения, и результат будет немного больше 0,3, но двойной для 0,3 немного меньше, так что они не равны. Ничто не нарушается. Каждый шаг делает именно то, что требует IEEE 754, и преобразователь позволяет вам наблюдать, как это происходит, вместо того, чтобы принимать это на веру.

Как только вы увидели это, исправление следует естественным образом: никогда не сравнивать плавающие значения для точного равенства. Сравните в пределах небольшого допуска, или используйте целые центы для денег, или десятичную библиотеку, когда вам нужна точная десятичная арифметика. ошибка никогда не была в сложении. Это было в ожидании двоичного формата, чтобы хранить десятичные дроби точно.

Что такое знак, показатель степени и мантисса?

Каждое поле имеет определенное задание, и конвертер помечает все три.

Знак бит самый простой: 0 означает положительный, 1 означает отрицательный. поскольку знак является отдельным битом, IEEE 754 имеет как положительный, так и отрицательный ноль, которые ведут себя одинаково при сравнениях, но несут разные биты.

Поле экспоненты хранит степень два, но с смещением добавлен, так что он может представлять отрицательные показатели степени без отдельного знака. смещение составляет 127 для одинарной точности и 1023 для двойной. Таким образом, сохраненное поле экспоненты 127 в одинарной точности означает фактический показатель степени ноль. Преобразователь Toolz.dev показывает оба числа: смещенное значение, которое живет в битах, и несмещенную силу двух, которое оно действительно применяется. это различие сбивает с толку многих людей, поэтому инструмент расписывает его, а не заставляет вычитать в голове.

Мантисса держит дробную часть мантиссы Для нормального числа есть подразумеваемый ведущий 1, который не хранится, потому что нормализованная двоичная мантисса всегда начинается с 1, поэтому формат получает свободный бит точности, оставив его вне. Вот почему одинарная точность дает около 7 десятичных цифр, а двойная дает примерно от 15 до 16, даже если поля мантиссы составляют 23 и 52 бита.

Вот как два формата выстраиваются в линию поле за полем:

Собственность Одиночный (binary32) Двойной (binary64)
Всего битов 32 64
Знаковые биты 1 1
Экспонентные биты 8 11
Биты Мантиссы 23 52
Экспонентная предвзятость 127 1023
Прим. десятичных цифр 7 с 15 по 16
Общее имя поплавок двойной

Как мне преобразовать биты обратно в десятичное число?

Декодирование так же полезно, как и кодирование, и это то, как вы читаете значение из дампа памяти, формата двоичного файла или сетевого протокола, который хранит необработанные плавающие числа. Установите тип ввода на Hex или Binary и вставьте точный битовый шаблон, который ожидает точность: 8 шестнадцатеричных цифр или 32 бита для одиночных, 16 шестнадцатеричных цифр или 64 бита для двойных.

Например, одноточный гекс 40490FDB декодирует на 3.1415927, ближайший к пи поплавок Преобразователь также принимает опционально 0x префикс и игнорирует пробелы и подчеркивания, поэтому вы можете вставлять сгруппированные байты по мере их нахождения. если вы дадите ему неправильное количество цифр, он точно скажет вам, сколько именно нужно этой точности, а не молча усекать, что является тем сообщением об ошибке, которое я желаю больше инструментов, которые удосужились написать.

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

Как представлены бесконечность, NaN и ноль?

Специальные значения - это то, где IEEE 754 становится умным, и конвертер идентифицирует каждый случай для вас, чтобы вам не приходилось запоминать шаблоны.

Поле экспоненты действует как переключатель Когда каждый бит экспоненты равен 1, вы находитесь в специальном диапазоне: мантисса все-ноль означает бесконечность, а любая мантисса ненулевое означает NaN, а не число Положительная и отрицательная бесконечность отличаются только знаковым битом NaN - это то, что вы получаете от операций, как ноль разделить на ноль или квадратный корень из отрицательного, и он обладает знаменитым свойством, что он не равен сам себе.

Когда каждый бит экспоненты равен 0, вы находитесь в другом специальном диапазоне: мантисса всего нуля равна нулю, положительна или отрицательна в зависимости от бита знака, а мантисса, отличная от нуля, является ненормальным числом. субнормальные значения заполняют пробел между нулем и наименьшим нормальным числом, обменивая точность на способность представлять очень крошечные величины. Они используют эффективный показатель степени единицы минус смещение и опускают подразумеваемый ведущий 1, который конвертер учитывает, когда показывает несмещенный показатель степени.

Все остальное, где поле экспоненты не все нули или все единицы, является нормальным числом. возможность взглянуть на битовый шаблон и мгновенно узнать, какой из этих пяти случаев вы смотрите, является подлинной отладочной сверхспособностью, когда вычисление дает значение, которого вы не ожидали.

Когда мне это действительно нужно?

Вам это нужно чаще, чем вы догадались бы, когда вы знаете, чтобы искать. Я достигаю его, когда числовой результат выключен из-за ошибки округления, и я хочу подтвердить, является ли значение точно представимым. Я использую его при записи или отладке двоичного сериализатора, формата файла или проводного протокола, который хранит плавающие данные, поэтому я могу проверить соответствие байтов тому, что я задумал. Это необходимо при сравнении одинарной и двойной точности, например, при принятии решения о том, может ли шейдер графического процессора использовать float не теряя слишком много точности. и это одно из самых четких учебных пособий, которые я знаю для компьютерной архитектуры, потому что вид полей делает абстрактный стандарт осязаемым.

Если вы строите через стек так, как я, плавающая точка появляется в удивительных местах: расчет цены в Laravel API, холст анимация в React, CSV экспорт, который искажает координату Понимание формата хранения является небольшой инвестиции, которая окупается по всем им. Я писал о том, как инструменты, подобные этому, вписываются в более широкий комплект в Набор инструментов для веб-разработчиков, и справочник преобразователя с основанием номера а руководство по двоичному переводчику более подробно рассмотрите соседние низкоуровневые преобразования.

Каковы пределы точности с плавающей запятой?

Как только вы можете увидеть биты, пределы формата перестают быть абстрактными. двойник имеет 52 сохраненных битов мантиссы плюс подразумеваемый ведущий 1, который работает примерно до 15 до 16 значащих десятичных цифр. Push мимо этого и точность тихо испаряется. самое большое целое число двойник может представлять с каждым значением между еще точным является 2 в 53 степени, что составляет 9007199254740992. Добавьте один к этому и результат округляется обратно вниз, потому что следующее представляемое значение находится на расстоянии двух, а не один. Вот почему языки, которые используют двойники для всех чисел, JavaScript среди них, раскрывают a Number.MAX_SAFE_INTEGER постоянна именно при этом значении, и почему большие идентификаторы баз данных, отправленные как номера JSON, могут молча повреждаться.

Разрыв между одним представимым значением и следующим называется единицей в последнем месте, или ULP, и он растет по мере роста величины. Около 1,0 разрыв крошечный; около миллиарда это несколько сотен; около максимального двойника, около 1,8 умножить на 10 до 308-го, разрыв между соседями астрономически велик. конвертер делает это видимым: кодируйте два близлежащих больших числа, и вы часто обнаружите, что они имеют одни и те же биты, потому что между ними просто нет представления. Понимание ULP - это то, что мешает вам ожидать большего разрешения, чем может дать формат.

Связанная ловушка - это катастрофическое гашение. когда вы вычитаете два почти равных числа с плавающей запятой, ведущие цифры сокращаются, и у вас остаются младшие биты, которые изначально были наименее точной частью. В результате можно доминировать из-за ошибки округления, даже если каждый вход выглядел точно. Вот почему численно осторожные операции переупорядочения кода, чтобы избежать вычитания близких величин, и почему суммирование длинного списка плавающих чисел в наивном цикле накапливает ошибку, которую избегают лучшие алгоритмы, такие как суммирование Кахана.

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

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

Как преобразовать десятичное число в IEEE 754?

Выберите одинарную или двойную точность, сохраните тип ввода в десятичном формате, введите свой номер и конвертируйте. Инструмент кодирует значение в свой битовый шаблон IEEE 754 и показывает бит знака, поле показателя степени, мантиссу, полный двоичный файл и шестнадцатеричный. Все это работает в вашем браузере.

В чем разница между одинарной и двойной точностью?

Одиночная точность (binary32) использует 32 бита: 1 знак, 8 показатель степени и 23 мантиссы, давая около 7 десятичных цифр точности. двойная точность (binary64) использует 64 бита: 1 знак, 11 показатель степени и 52 мантиссы, давая от 15 до 16 цифр. Double - это тип плавающего значения по умолчанию в большинстве языков; одиночный распространен на графических процессорах и в коде с ограниченным объемом памяти.

Почему 0,1 не преобразуется в точное значение?

0.1 не имеет конечного представления в двоичной плавающей запятой, так же как 1/3 не имеет конечной десятичной дроби Ближайший представимый двойник - 0,1000000000005551151231257827021181583404541015625. конвертер показывает сохраненное значение, считанное обратно из битов, так что вы можете увидеть крошечную разницу, которая вызывает сюрпризы округления, такие как 0,1 + 0,2, не равное 0,3.

Что такое знак, показатель степени и мантисса?

Знак бит 0 для положительного и 1 для отрицательного. поле экспоненты хранит степень два с добавленной смещением (127 для одиночного, 1023 для двойного), поэтому инструмент показывает как смещенное значение в битах, так и несмещенную силу, которую он применяет. мантисса удерживает дробную часть мантиссы, с подразумеваемым ведущим 1 для нормальных чисел.

Могу ли я преобразовать 754 бита IEEE обратно в десятичное число?

Да. Установите тип ввода на Hex или Binary и вставьте точный шаблон битов: 8 шестнадцатеричных цифр или 32 бита для одинарной точности, 16 шестнадцатеричных цифр или 64 бита для двойных. инструмент декодирует его и показывает десятичное значение, которое он представляет, вместе с полным разбиением поля.

Как представлены бесконечность, NaN и ноль?

Когда каждый бит показателя степени равен 1, мантисса, равная нулю, означает бесконечность, а мантисса, отличная от нуля, означает NaN. Когда каждый бит показателя степени равен 0, мантисса, равная нулю, равна нулю (положительная или отрицательная в зависимости от бита знака), а ненулевая мантисса - это ненормальное число. Преобразователь помечает каждый из этих случаев для вас.

Безопасно ли использовать этот инструмент для чувствительных чисел?

Да. преобразование полностью выполняется в JavaScript в вашем браузере. ни один сетевой запрос не несет ваш ввод, ничего не хранится, и инструмент работает в автономном режиме после загрузки страницы, поэтому любое введенное вами значение остается на вашем устройстве.

Какой шестигранный формат ожидает конвертер?

Простые шестнадцатеричные цифры, с необязательным префиксом 0x и пробелами или подчеркиваниями для группировки, которые игнорируются Одиночная точность ожидает 8 шестнадцатеричных цифр и двойная точность ожидает 16 Например, 40490FDB является одноточным пи (3.1415927).


Исследуйте биты самостоятельно с помощью бесплатного Преобразователь IEEE 754. Он кодирует и декодирует плавающие устройства одинарной и двойной точности полностью в вашем браузере, ничего не загружая.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!