Формат с плавающей запятой одинарной точности (иногда называемый FP32 или float32 ) - это формат компьютерных чисел , обычно занимающий 32 бита в компьютерной памяти ; он представляет широкий динамический диапазон числовых значений с использованием точки с плавающей запятой .
Переменная с плавающей запятой может представлять более широкий диапазон чисел, чем переменная с фиксированной запятой той же разрядности за счет точности. Подписано 32-битное целое число , переменная имеет максимальное значение , равное 2 31 - 1 = 2147483647, в то время как 754 стандарта IEEE 32-битная база-2 переменная с плавающей точкой имеет максимальное значение (2 - 2 -23 ) × 2 127 ≈ 3.4028235 × 10 38 . Все целые числа с 7 или менее десятичными знаками и любые 2 n для целого числа −149 ≤ n ≤ 127 могут быть точно преобразованы в значение с плавающей запятой одинарной точности IEEE 754.
В IEEE 754-2008 стандарт , формат 32-битная база-2 официально называется binary32 ; в IEEE 754-1985 он назывался синглом . IEEE 754 определяет дополнительные типы с плавающей запятой, такие как 64-битные представления с двойной точностью по основанию 2 и, в последнее время, представления с основанием 10.
Одним из первых языков программирования, предоставивших типы данных с плавающей запятой одинарной и двойной точности, был Фортран . До широкого принятия IEEE 754-1985 представление и свойства типов данных с плавающей запятой зависели от производителя компьютера и модели компьютера, а также от решений, принимаемых разработчиками языков программирования. Например, тип данных одинарной точности GW-BASIC был 32-битным форматом с плавающей запятой MBF .
Одинарная точность называется REAL в Фортране , [1] SINGLE-FLOAT в Common Lisp , [2] float в C , C ++ , C # , Java , [3] Float в Haskell , [4] и Single в Object Pascal ( Delphi ), Visual Basic и MATLAB . Однако float в Python , Ruby , PHP и OCamlи single в версиях Octave до 3.2 относятся к числам с двойной точностью . В большинстве реализаций PostScript и некоторых встроенных системах единственная поддерживаемая точность - одинарная.
Форматы с плавающей запятой |
---|
IEEE 754 |
|
Другой |
|
Двоичный формат с плавающей запятой одинарной точности IEEE 754: binary32 [ править ]
Стандарт IEEE 754 определяет binary32 как имеющий:
- Знаковый бит : 1 бит
- Ширина экспоненты : 8 бит
- Существенная точность : 24 бита (23 сохранены явно)
Это дает точность от 6 до 9 десятичных знаков . Если десятичная строка, содержащая не более 6 значащих цифр, преобразована в представление с одинарной точностью IEEE 754, а затем преобразована обратно в десятичную строку с тем же количеством цифр, окончательный результат должен соответствовать исходной строке. Если число с одинарной точностью IEEE 754 преобразовано в десятичную строку, содержащую не менее 9 значащих цифр, а затем преобразовано обратно в представление с одинарной точностью, окончательный результат должен совпадать с исходным числом. [5]
Знаковый бит определяет знак числа, который также является знаком мантиссы. Показатель степени представляет собой 8-битовое целое число без знака от 0 до 255 в смещенной форме : значение степени 127 представляет фактический ноль. Показатели варьируются от -126 до +127, потому что показатели -127 (все нули) и +128 (все единицы) зарезервированы для специальных чисел.
Истинное значение включает 23 дробных бита справа от двоичной точки и неявный ведущий бит (слева от двоичной точки) со значением 1, если показатель степени не сохранен со всеми нулями. Таким образом , только 23 фракций бит мантисс появляются в формате память, но общая точность 24 бита (эквивалент для входа 10 (2 24 ) ≈ 7.225 десятичных цифр). Биты расположены следующим образом:
Действительное значение, принимаемое заданными 32-битными двоичными 32 данными с заданным знаком , смещенной экспонентой e (8-битное целое число без знака) и 23-битной дробью, равно
- ,
который дает
В этом примере:
- ,
- ,
- ,
- ,
- .
таким образом:
- .
Примечание:
- ,
- ,
- ,
- .
Экспонентное кодирование [ править ]
Двоичная экспонента с плавающей запятой одинарной точности кодируется с использованием двоичного представления смещения с нулевым смещением 127; также известный как смещение экспоненты в стандарте IEEE 754.
- E мин = 01 H −7F H = −126
- E макс = FE H −7F H = 127
- Смещение экспоненты = 7F H = 127
Таким образом, чтобы получить истинную экспоненту, как определено двоичным представлением смещения, смещение 127 должно быть вычтено из сохраненной экспоненты.
Сохраненные экспоненты 00 H и FF H интерпретируются особым образом.
Экспонента | фракция = 0 | дробь ≠ 0 | Уравнение |
---|---|---|---|
00 часов | нуль | субнормальное число | |
01 H , ..., FE H | нормальное значение | ||
FF H | ± бесконечность | NaN (тихо, сигнализирует) |
Минимальное положительное нормальное значение равно, а минимальное положительное (субнормальное) значение .
Преобразование из десятичного представления в формат binary32 [ править ]
Этот раздел, возможно, содержит оригинальные исследования . Февраль 2020 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
Этот раздел может сбивать с толку или непонятно читателям . В частности, примеры представляют собой простые частные случаи (простые значения, точно представимые в двоичном формате, без экспонентной части). Этот раздел также, вероятно, не по теме: это статья не о преобразовании, а преобразование из десятичного числа с использованием десятичной арифметики (в отличие от преобразования из символьной строки) встречается редко. Февраль 2020 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
В общем, обратитесь к самому стандарту IEEE 754 для строгого преобразования (включая поведение округления) действительного числа в его эквивалентный формат binary32.
Здесь мы можем показать, как преобразовать действительное число с основанием 10 в двоичный 32-формат IEEE 754, используя следующую схему:
- Рассмотрим действительное число с целой и дробной частью, например 12,375.
- Преобразование и нормализация целой части в двоичную
- Преобразуйте дробную часть, используя следующую технику, как показано здесь.
- Добавьте два результата и настройте их, чтобы получить правильное окончательное преобразование.
Преобразование дробной части: Рассмотрим 0,375, дробную часть 12,375. Чтобы преобразовать его в двоичную дробь, умножьте дробь на 2, возьмите целую часть и повторите с новой дробью на 2, пока не будет найдена дробная часть нуля или пока не будет достигнут предел точности, который составляет 23 цифры дробной части для формата IEEE 754 binary32 .
- , целая часть представляет собой двоичную дробную цифру. Чтобы продолжить, умножьте 0,750 на 2.
- , дробь = 0,000, закончить
Мы видим, что это может быть точно представлено в двоичном виде как . Не все десятичные дроби могут быть представлены в виде конечной двоичной дроби. Например, десятичное число 0,1 не может быть точно представлено в двоичном формате, оно может быть только приближенным. Следовательно:
Поскольку формат IEEE 754 binary32 требует, чтобы реальные значения были представлены в формате (см. Нормализованное число , Денормализованное число ), 1100.011 сдвигается вправо на 3 цифры, чтобы стать
Наконец, мы видим, что:
Из чего мы делаем вывод:
- Показатель степени равен 3 (и, следовательно, в смещенной форме )
- Дробь равна 100011 (если смотреть справа от двоичной точки)
Из них мы можем сформировать результирующее 32-битное представление формата binary32 IEEE 754 для 12,375:
Примечание: подумайте о преобразовании 68,123 в двоичный 32-формат IEEE 754: используя описанную выше процедуру, вы ожидаете получить с последними 4 битами, равными 1001. Однако из-за поведения округления по умолчанию формата IEEE 754 вы получите , чьи последние 4 бита равны 1010.
Пример 1: Рассмотрим десятичную дробь 1. Мы видим, что:
Из чего мы делаем вывод:
- Показатель степени равен 0 (и, следовательно, в смещенной форме )
- Дробь равна 0 (если смотреть справа от двоичной точки в 1.0, все )
Из них мы можем сформировать результирующее 32-битное представление в формате binary32 IEEE 754 действительного числа 1:
Пример 2: Рассмотрим значение 0,25. Мы видим, что:
Из чего мы делаем вывод:
- Показатель степени равен −2 (и в смещенной форме это так )
- Дробь равна 0 (если смотреть справа от двоичной точки в 1.0, все нули)
Из них мы можем сформировать результирующее 32-битное представление формата binary32 IEEE 754 действительного числа 0,25:
Пример 3: Рассмотрим значение 0,375. Мы видели это
Следовательно, после определения представления 0,375, мы можем продолжить, как указано выше:
- Показатель степени равен −2 (и в смещенной форме это так )
- Дробь равна 1 (если смотреть справа от двоичной точки в 1.1, это одно )
Из них мы можем сформировать результирующее 32-битное представление в формате binary32 IEEE 754 действительного числа 0,375:
Примеры одинарной точности [ править ]
Эти примеры даны в битовом представлении , в шестнадцатеричном и двоичном формате значения с плавающей запятой. Сюда входят знак, (смещенная) экспонента и значащая величина.
0 00000000 00000000000000000000001 2 = 0000 0001 16 = 2 −126 × 2 −23 = 2 −149 ≈ 1,4012984643 × 10 −45 (наименьшее положительное субнормальное число)
0 00000000 11111111111111111111111 2 = 007f ffff 16 = 2 −126 × (1-2 −23 ) ≈ 1,1754942107 × 10 −38 (наибольшее субнормальное число)
0 00000001 +00000000000000000000000 2 = 0080 0000 16 = 2 -126 ≈ 1,1754943508 × 10 -38 (наименьшее положительное нормальное число)
0 11111110 +11111111111111111111111 2 = 7f7f FFFF 16 = 2 127 × (2 - 2 -23 ) ≈ 3,4028234664 × 10 38 (наибольшее нормальное число)
0 01111110 11111111111111111111111 2 = 3f7f ffff 16 = 1-2 −24 ≈ 0,999999940395355225 (наибольшее число меньше единицы)
0 01111111 00000000000000000000000 2 = 3f80 0000 16 = 1 (один)
0 01111111 00000000000000000000001 2 = 3f80 0001 16 = 1 + 2 −23 ≈ 1.00000011920928955 (наименьшее число больше единицы)
1 10000000 00000000000000000000000 2 = c000 0000 16 = −20 00000000 00000000000000000000000 2 = 0000 0000 16 = 01 00000000 00000000000000000000000 2 = 8000 0000 16 = −0 0 11111111 00000000000000000000000 2 = 7f80 0000 16 = бесконечность1 11111111 00000000000000000000000 2 = ff80 0000 16 = −infinity 0 10000000 10010010000111111011011 2 = 4049 0fdb 16 ≈ 3,14159274101257324 ≈ π (пи)0 01111101 01010101010101010101011 2 = 3eaa aaab 16 ≈ 0,333333343267440796 ≈ 1/3 x 11111111 10000000000000000000001 2 = ffc0 0001 16 = qNaN (на процессорах x86 и ARM)x 11111111 00000000000000000000001 2 = ff80 0001 16 = sNaN (на процессорах x86 и ARM)
По умолчанию 1/3 округляется в большую сторону , а не в меньшую, как при двойной точности , из-за четного числа бит в мантиссе. Биты на 1/3 за точкой округления - 1010...
это более 1/2 единицы в последнем месте .
Кодировки qNaN и sNaN не указаны в IEEE 754 и по-разному реализованы на разных процессорах. Семейство x86 и процессоры семейства ARM используют старший бит значимого поля для обозначения тихого NaN. Процессоры PA-RISC используют этот бит для указания NaN сигнализации.
Преобразование двоичного числа с одинарной точностью в десятичное [ править ]
Этот раздел, возможно, содержит оригинальные исследования . Февраль 2020 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
Этот раздел может сбивать с толку или непонятно читателям . В частности, есть только очень простой пример без округления. Этот раздел, вероятно, тоже не по теме: это статья не о преобразовании, а преобразование в десятичное число с использованием десятичной арифметики - редкость. Февраль 2020 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
В этом примере мы начнем с шестнадцатеричного представления значения 41C80000 и преобразуем его в двоичное:
затем мы разбиваем его на три части: бит знака, показатель степени и значащая величина.
- Знаковый бит:
- Показатель:
- Значение:
Затем мы добавляем неявный 24-й бит к мантиссе:
- Значение:
и декодируем значение экспоненты вычитанием 127:
- Необработанная экспонента:
- Расшифрованная экспонента:
Каждый из 24 бит мантиссы (включая неявный 24-й бит), от бита 23 до бита 0, представляет собой значение, начиная с 1 и уменьшающееся вдвое для каждого бита, следующим образом:
бит 23 = 1бит 22 = 0,5бит 21 = 0,25бит 20 = 0,125бит 19 = 0,0625бит 18 = 0,03125..бит 0 = 0,00000011920928955078125
Мантисса в этом примере имеет три установленных бита: бит 23, бит 22 и бит 19. Теперь мы можем декодировать мантиссу, складывая значения, представленные этими битами.
- Расшифрованное значение:
Затем нам нужно умножить с основанием 2 на степень экспоненты, чтобы получить окончательный результат:
Таким образом
Это эквивалентно:
где s - знаковый бит, x - показатель степени, а m - значение.
Ограничения точности десятичных значений в [1, 16777216] [ править ]
- Десятичные числа от 1 до 2: фиксированный интервал 2 −23 (1 + 2 −23 - следующее по величине число с плавающей точкой после 1)
- Десятичные числа от 2 до 4: фиксированный интервал 2 −22
- Десятичные числа от 4 до 8: фиксированный интервал 2 −21
- ...
- Десятичные числа от 2 n до 2 n + 1 : фиксированный интервал 2 n-23
- ...
- Десятичные числа от 2 22 = 4194304 до 2 23 = 8388608: фиксированный интервал 2 −1 = 0,5
- Десятичные числа от 2 23 = 8388608 до 2 24 = 16777216: фиксированный интервал 2 0 = 1
Ограничения точности для целочисленных значений [ править ]
- Целые числа от 0 до 16777216 могут быть точно представлены (также применимо к отрицательным целым числам от -16777216 до 0)
- Целые числа от 2 24 = 16777216 до 2 25 = 33554432 округляются до кратного 2 (четного числа).
- Целые числа от 2 25 до 2 26 округляются до кратного 4
- ...
- Целые числа от 2 n до 2 n + 1 округлить до кратного 2 n-23
- ...
- Целых между 2 127 и 2 128 раундом кратными 2 104
- Целые числа больше или равные 2 128 округляются до «бесконечности».
Оптимизация [ править ]
Конструкция формата с плавающей запятой допускает различные оптимизации, являющиеся результатом простой генерации аппроксимации логарифма с основанием 2 из целочисленного представления необработанного битового шаблона. Целочисленная арифметика и сдвиг битов могут дать приближение к обратному квадратному корню ( быстрый обратный квадратный корень ), что обычно требуется в компьютерной графике .
См. Также [ править ]
- Стандарт IEEE для арифметики с плавающей запятой (IEEE 754)
- ISO / IEC 10967 , арифметика, не зависящая от языка
- Примитивный тип данных
- Численная стабильность
Ссылки [ править ]
- ^ "РЕАЛЬНОЕ заявление" . scc.ustc.edu.cn .
- ^ "CLHS: Тип КОРОТКОПЛАВЧИЙ, ОДНОПЛАВЧИЙ, ДВОЙНОЙ ..."
- ^ «Примитивные типы данных» . Документация по Java .
- ^ «6 предопределенных типов и классов» . haskell.org . 20 июля 2010 г.
- ↑ Уильям Кахан (1 октября 1997 г.). «Лекционные заметки о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 4.
Внешние ссылки [ править ]
- Живой редактор битовых шаблонов с плавающей запятой
- Онлайн калькулятор
- Онлайн-конвертер чисел IEEE 754 с одинарной точностью
- Исходный код C для преобразования между двойной, одинарной и половинной точностью IEEE