Формат с плавающей запятой одинарной точности - Single-precision floating-point format
Формат с плавающей запятой одинарной точности (иногда называют FP32 или же float32) это формат номера компьютера, обычно занимая 32 бит в память компьютера; он представляет собой широкий динамический диапазон числовых значений с помощью плавающая точка счисления.
Переменная с плавающей запятой может представлять более широкий диапазон чисел, чем фиксированная точка переменная той же разрядности за счет точности. А подписанный 32-битный целое число переменная имеет максимальное значение 231 - 1 = 2 147 483 647, тогда как IEEE 754 32-битная переменная с плавающей запятой base-2 имеет максимальное значение (2 - 2−23) × 2127 ≈ 3.4028235 × 1038. Все целые числа с 7 или менее десятичными знаками и любые 2п для целого числа −149 ≤ п ≤ 127, могут быть точно преобразованы в значение с плавающей запятой одинарной точности IEEE 754.
в IEEE 754-2008 стандарт, 32-битный формат base-2 официально называется двоичный32; это называлось Один в IEEE 754-1985. IEEE 754 определяет дополнительные типы с плавающей запятой, такие как 64-битное основание-2. двойная точность и, совсем недавно, представления base-10.
Один из первых языки программирования для предоставления типов данных с плавающей запятой одинарной и двойной точности было Фортран. До широкого распространения IEEE 754-1985 представление и свойства типов данных с плавающей запятой зависели от производитель компьютеров компьютерная модель и решения, принятые разработчиками языков программирования. Например., GW-BASIC тип данных с одинарной точностью был 32-битный MBF формат с плавающей точкой.
Одинарная точность называется НАСТОЯЩИЙ в Фортран,[1] ОДНОПЛАВКОВЫЕ в Common Lisp,[2] плавать в C, C ++, C #, Ява,[3] Плавать в Haskell,[4] и Одинокий в Object Pascal (Delphi ), Visual Basic, и MATLAB. Тем не мение, плавать в Python, Рубин, PHP, и OCaml и Один в версиях Октава до 3.2 см. двойная точность числа. В большинстве реализаций PostScript, и немного встроенные системы, единственная поддерживаемая точность - single.
Плавающая точка форматы |
---|
IEEE 754 |
|
Другой |
Двоичный формат с плавающей запятой одинарной точности IEEE 754: binary32
Стандарт IEEE 754 определяет двоичный32 как имеющий:
- Знаковый бит: 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 бита (что эквивалентно log10(224) ≈ 7,225 десятичных знаков). Биты расположены следующим образом:
Реальное значение, принимаемое данным 32-битным двоичный32 данные с заданным знак, смещенная экспонента е (8-битное целое число без знака) и 23-битная дробь является
- ,
что дает
В этом примере:
- ,
- ,
- ,
- ,
- .
таким образом:
- .
Примечание:
- ,
- ,
- ,
- .
Экспонентное кодирование
Двоичная экспонента с плавающей запятой одинарной точности кодируется с использованием смещение-двоичный представление с нулевым смещением 127; также известный как смещение экспоненты в стандарте IEEE 754.
- Eмин = 01ЧАС−7FЧАС = −126
- EМаксимум = FEЧАС−7FЧАС = 127
- Экспонентное смещение = 7FЧАС = 127
Таким образом, чтобы получить истинную экспоненту, как определено двоичным представлением смещения, смещение 127 должно быть вычтено из сохраненной экспоненты.
Сохраненные экспоненты 00ЧАС и FFЧАС интерпретируются специально.
Экспонента | фракция = 0 | дробь ≠ 0 | Уравнение |
---|---|---|---|
00ЧАС | нуль | субнормальное число | |
01ЧАС, ..., ИПЧАС | нормальное значение | ||
FFЧАС | ±бесконечность | NaN (тихо, сигнализирует) |
Минимальное положительное нормальное значение равно а минимальное положительное (субнормальное) значение равно .
Преобразование из десятичного представления в формат binary32
Эта секция возможно содержит оригинальные исследования.Февраль 2020 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Эта секция может быть сбивает с толку или неясно читателям. В частности, примеры представляют собой простые частные случаи (простые значения, точно представимые в двоичном формате, без экспоненты). Этот раздел также, вероятно, не по теме: это статья не о преобразовании, а преобразование из десятичного числа с использованием десятичной арифметики (в отличие от преобразования из символьной строки) встречается редко.Февраль 2020 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В общем, обратитесь к самому стандарту IEEE 754 для строгого преобразования (включая поведение округления) действительного числа в его эквивалентный формат binary32.
Здесь мы можем показать, как преобразовать вещественное число с основанием 10 в двоичный формат 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 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45 (наименьшее положительное субнормальное число)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38 (наибольшее субнормальное число)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38 (наименьшее положительное нормальное число)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038 (наибольшее нормальное число)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0,999999940395355225 (наибольшее число меньше единицы)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (один)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1.00000011920928955 (наименьшее число больше единицы)
1 10000000 000000000000000000000002 = c000 000016 = −20 00000000 000000000000000000000002 = 0000 000016 = 01 00000000 000000000000000000000002 = 8000 000016 = −0 0 11111111 000000000000000000000002 = 7f80 000016 = бесконечность1 11111111 000000000000000000000002 = ff80 000016 = −infinity 0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3,14159274101257324 ≈ π (пи) 0 01111101 010101010101010101010112 = 3eaa aaab16 ≈ 0,333333343267440796 ≈ 1/3 x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (на процессорах x86 и ARM) x 11111111 000000000000000000000012 = ff80 000116 = sNaN (на процессорах x86 и ARM)
По умолчанию 1/3 округляется вверх, а не вниз, как двойная точность, из-за четного числа бит в мантиссе. Биты на 1/3 за точкой округления равны 1010...
что составляет более 1/2 единица на последнем месте.
Кодировки qNaN и sNaN не указаны в IEEE 754 и реализованы по-разному на разных процессорах. В x86 семья и РУКА Семейные процессоры используют старший бит значимого поля для обозначения тихого 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 это знаковый бит, Икс - показатель степени, а м это значение.
Ограничения точности десятичных значений в [1, 16777216]
- Десятичные числа от 1 до 2: фиксированный интервал 2−23 (1+2−23 является следующим по величине числом с плавающей запятой после 1)
- Десятичные числа от 2 до 4: фиксированный интервал 2−22
- Десятичные числа от 4 до 8: фиксированный интервал 2−21
- ...
- Десятичные числа от 2п и 2п + 1: фиксированный интервал 2п-23
- ...
- Десятичные числа от 222= 4194304 и 223= 8388608: фиксированный интервал 2−1=0.5
- Десятичные числа от 223= 8388608 и 224= 16777216: фиксированный интервал 20=1
Ограничения точности для целочисленных значений
- Целые числа от 0 до 16777216 могут быть точно представлены (также применимо к отрицательным целым числам от -16777216 до 0)
- Целые числа от 224= 16777216 и 225= 33554432 округлить до кратного 2 (четное число)
- Целые числа от 225 и 226 округлить до кратного 4
- ...
- Целые числа от 2п и 2п + 1 округлить до кратного 2п-23
- ...
- Целые числа от 2127 и 2128 округлить до кратного 2104
- Целые числа больше или равные 2128 округляются до «бесконечности».
Оптимизация
Дизайн формата с плавающей запятой допускает различные оптимизации, в результате простой генерации логарифм по основанию 2 аппроксимация из целочисленного представления необработанного битового шаблона. Целочисленная арифметика и сдвиг битов могут дать приближение к обратный квадратный корень (быстрый обратный квадратный корень ), обычно требуемый в компьютерная графика.
Смотрите также
- Стандарт IEEE для арифметики с плавающей запятой (IEEE 754)
- ISO / IEC 10967, независимая от языка арифметика
- Примитивный тип данных
- Численная стабильность
Рекомендации
- ^ «НАСТОЯЩЕЕ заявление». scc.ustc.edu.cn.
- ^ "CLHS: Тип КОРОТКОПЛАВЫЧНЫЙ, ОДНОПЛАВЧИЙ, ДВОЙНОЙ ..."
- ^ «Примитивные типы данных». Документация по Java.
- ^ «6 предопределенных типов и классов». haskell.org. 20 июля 2010 г.
- ^ Уильям Кахан (1 октября 1997 г.). «Лекционные заметки о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF). п. 4.