Формат с плавающей запятой одинарной точности
Формат чисел с плавающей запятой одинарной точности (иногда называемый FP32 или float32 ) — это компьютерный числовой формат , обычно занимающий 32 бита в памяти компьютера ; он представляет широкий динамический диапазон числовых значений с использованием плавающей точки счисления .
Переменная с плавающей запятой может представлять более широкий диапазон чисел, чем переменная с фиксированной запятой той же разрядности, но за счет точности. переменная со знаком 32-битная целочисленная имеет максимальное значение 2. 31 − 1 = 2 147 483 647, тогда как 32-битная переменная с плавающей запятой по основанию 2 IEEE 754 имеет максимальное значение (2 − 2 −23 ) × 2 127 ≈ 3.4028235 × 10 38 . Все целые числа с 7 или менее десятичными цифрами и любые 2 н для целого числа −149 ≤ n ≤ 127 можно точно преобразовать в значение с плавающей запятой одинарной точности IEEE 754.
IEEE 754 В стандарте битный формат по основанию 2 официально называетсяbinary32 32 - ; он был назван синглом в 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 ] Плавающее число в Haskell [ 4 ] и Свифт ; [ 5 ] и Single в Object Pascal ( Delphi ), Visual Basic и MATLAB . Однако числа с плавающей запятой в Python , Ruby , PHP и OCaml и одиночные в версиях Octave до 3.2 относятся к числам двойной точности . В большинстве реализаций PostScript и некоторых встроенных системах поддерживается только одинарная точность.
с плавающей запятой Форматы |
---|
ИЭЭЭ 754 |
|
Другой |
Альтернативы |
Стандарт IEEE 754: двоичный32
[ редактировать ]Стандарт IEEE 754 определяет двоичный файл32 как имеющий:
- Знаковый бит : 1 бит
- Ширина экспоненты : 8 бит
- значащего числа Точность : 24 бита (23 хранятся явно)
Это дает точность от 6 до 9 значащих десятичных цифр . Если десятичная строка, содержащая не более 6 значащих цифр, преобразуется в формат одинарной точности IEEE 754, давая нормальное число , а затем преобразуется обратно в десятичную строку с тем же количеством цифр, конечный результат должен соответствовать исходной строке. Если число IEEE 754 с одинарной точностью преобразуется в десятичную строку, содержащую не менее 9 значащих цифр, а затем преобразуется обратно в представление с одинарной точностью, конечный результат должен соответствовать исходному числу. [ 6 ]
Знаковый бит определяет знак числа, который также является знаком мантиссы. Поле экспоненты представляет собой 8-битное целое число без знака от 0 до 255 в смещенной форме : значение 127 представляет собой фактический нулевой показатель экспоненты. Показатели варьируются от -126 до +127 (таким образом, от 1 до 254 в поле показателя), поскольку смещенные значения показателя степени 0 (все 0) и 255 (все 1) зарезервированы для специальных чисел ( субнормальные числа , нули со знаком , бесконечности и NaN ).
Истинное значение нормальных чисел включает 23 бита дробной части справа от двоичной точки и неявный ведущий бит (слева от двоичной точки) со значением 1. Субнормальные числа и нули (которые представляют собой числа с плавающей запятой, меньшие по величине). чем наименьшее положительное нормальное число) представлены смещенным значением показателя степени 0, что дает неявному ведущему биту значение 0. Таким образом, только 23 дробных бита мантиссы в формате памяти появляются , но общая точность составляет 24 бита (что эквивалентно логарифму 10 (2 24 ) ≈ 7,225 десятичных цифр).
Биты расположены следующим образом:
Реальное значение, принимаемое данными 32-битными двоичными32 данными с заданным знаком , смещенным показателем степени e (8-битное целое число без знака) и 23-битной дробью , равно
- ,
что дает
В этом примере:
- ,
- ,
- ,
- ,
- .
таким образом:
- .
Примечание:
- ,
- ,
- ,
- .
Экспоненциальное кодирование
[ редактировать ]Двоичный показатель с плавающей запятой одинарной точности кодируется с использованием двоичного представления смещения , при этом нулевое смещение равно 127; также известное как смещение экспоненты в стандарте IEEE 754.
- E min = 01 H −7F H = −126
- Emax H = FE 127 −7F H =
- Смещение показателя = 7F H = 127
Таким образом, чтобы получить истинный показатель степени, определенный в двоичном представлении смещения, смещение 127 необходимо вычесть из сохраненного показателя степени.
Сохраненные показатели степени 00 H и FF H интерпретируются особым образом.
Экспонента | дробь = 0 | дробь ≠ 0 | Уравнение |
---|---|---|---|
00H = 00000000 2 | ±zero | субнормальное число | |
01 H , ..., FE H = 00000001 2 , ..., 11111110 2 | нормальное значение | ||
ФФ Ч = 11111111 2 | ± infinity | NaN (тихо, сигнализация) |
Минимальное положительное нормальное значение равно а минимальное положительное (субнормальное) значение равно .
Преобразование десятичной дроби в двоичную32
[ редактировать ]Возможно, этот раздел содержит оригинальные исследования . ( февраль 2020 г. ) |
Этот раздел может сбивать с толку или быть неясным для читателей . В частности, примеры представляют собой простые частные случаи (простые значения, точно представимые в двоичном виде, без показательной части). Этот раздел также, вероятно, не по теме: это статья не о преобразовании, а преобразование из десятичной системы с использованием десятичной арифметики (в отличие от преобразования из символьной строки) встречается редко. ( февраль 2020 г. ) |
В общем, обратитесь к самому стандарту IEEE 754 для строгого преобразования (включая поведение округления) действительного числа в его эквивалентный форматbinary32.
Здесь мы можем показать, как преобразовать вещественное число по основанию 10 в формат Binary32 IEEE 754, используя следующую схему:
- Рассмотрим действительное число с целой и дробной частью, например 12,375.
- Преобразуйте и нормализуйте целую часть в двоичную.
- Преобразуйте дробную часть, используя следующую технику, как показано здесь.
- Сложите два результата и откорректируйте их, чтобы получить правильное окончательное преобразование.
Преобразование дробной части: Рассмотрим 0,375, дробную часть 12,375. Чтобы преобразовать ее в двоичную дробь, умножьте дробь на 2, возьмите целую часть и повторите с новой дробью на 2, пока не будет найдена нулевая дробь или пока не будет достигнут предел точности, который составляет 23 цифры дроби для формата IEEE 754binary32. .
- , целая часть представляет цифру двоичной дроби. Чтобы продолжить, умножьте 0,750 на 2.
- , дробь = 0,011, прекратить
Мы видим это может быть точно представлено в двоичном виде как . Не все десятичные дроби можно представить в виде конечной двоичной дроби. Например, десятичное число 0,1 не может быть представлено в двоичном формате точно, а только приблизительно. Поэтому:
Поскольку формат двоичный32 IEEE 754 требует представления реальных значений в формате (см. Нормализованное число , Денормализованное число ), 1100,011 сдвигается вправо на 3 цифры и становится
Наконец мы видим это:
Из чего делаем вывод:
- Показатель степени равен 3 (и поэтому в смещенной форме он равен )
- Дробь равна 100011 (смотря справа от двоичной точки).
Из них мы можем сформировать результирующее 32-битное представление формата IEEE 754binary32 для числа 12,375:
Примечание. Рассмотрите возможность преобразования 68.123 в формат двоичного32 IEEE 754. Используя описанную выше процедуру, вы ожидаете получить последние 4 бита равны 1001. Однако из-за округления по умолчанию в формате IEEE 754 вы получаете , последние 4 бита которого равны 1010.
Пример 1: Рассмотрим десятичную цифру 1. Мы видим, что:
Из чего делаем вывод:
- Показатель степени равен 0 (и поэтому в смещенной форме он равен
- Дробь равна 0 (если смотреть направо от двоичной точки в 1,0, то все )
Из них мы можем сформировать результирующее представление действительного числа 1 в 32-битном формате IEEE 754binary32:
Пример 2: Рассмотрим значение 0,25. Мы можем это видеть:
Из чего делаем вывод:
- Показатель степени равен −2 (и в смещенной форме он равен )
- Дробь равна 0 (если смотреть направо от двоичной точки в 1,0, то все нули)
Из них мы можем сформировать результирующее 32-битное представление формата IEEE 754binary32 действительного числа 0,25:
Пример 3: Рассмотрим значение 0,375. Мы видели это
Следовательно, после определения представления 0,375 как мы можем действовать, как указано выше:
- Показатель степени равен −2 (и в смещенной форме он равен )
- Дробь равна 1 (если смотреть справа от двоичной точки в 1.1, это одна )
Из них мы можем сформировать результирующее 32-битное представление формата IEEE 754binary32 действительного числа 0,375:
Преобразование бинарного32 в десятичное
[ редактировать ]Возможно, этот раздел содержит оригинальные исследования . ( февраль 2020 г. ) |
Этот раздел может сбивать с толку или быть неясным для читателей . В частности, есть только очень простой пример, без округлений. Этот раздел также, вероятно, не по теме: это статья не о преобразовании, а преобразование в десятичное число с использованием десятичной арифметики встречается редко. ( февраль 2020 г. ) |
Если значениеbinary32, 41C80000 в этом примере имеет шестнадцатеричный формат, мы сначала преобразуем его в двоичный:
затем мы разбиваем его на три части: знаковый бит, показатель степени и мантисса.
- Знаковый бит:
- Экспонента:
- Значение:
Затем мы добавляем неявный 24-й бит к мантиссе:
- Значение:
и декодируем значение показателя степени, вычитая 127:
- Необработанный показатель:
- Декодированная экспонента:
Каждый из 24 бит мантиссы (включая неявный 24-й бит), от бита 23 до бита 0, представляет значение, начиная с 1 и пополам для каждого бита, следующим образом:
bit 23 = 1 bit 22 = 0.5 bit 21 = 0.25 bit 20 = 0.125 bit 19 = 0.0625 bit 18 = 0.03125 bit 17 = 0.015625 . . bit 6 = 0.00000762939453125 bit 5 = 0.000003814697265625 bit 4 = 0.0000019073486328125 bit 3 = 0.00000095367431640625 bit 2 = 0.000000476837158203125 bit 1 = 0.0000002384185791015625 bit 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 н и 2 п+1 : фиксированный интервал 2 н-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 н и 2 п+1 округлить до кратного 2 н-23
- ...
- Целые числа между 2 127 и 2 128 округлить до кратного 2 104
- Целые числа больше или равны 2 128 округляются до «бесконечности».
Известные случаи одинарной точности
[ редактировать ]Эти примеры даны в битовом представлении , в шестнадцатеричном и двоичном формате , значения с плавающей запятой. Сюда входят знак, (смещенный) показатель и мантисса.
0 00000000 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45 (smallest positive subnormal number)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38 (largest subnormal number)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38 (smallest positive normal number)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038 (largest normal number)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0.999999940395355225 (largest number less than one)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (one)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1.00000011920928955 (smallest number larger than one)
1 10000000 000000000000000000000002 = c000 000016 = −2 0 00000000 000000000000000000000002 = 0000 000016 = 0 1 00000000 000000000000000000000002 = 8000 000016 = −0 0 11111111 000000000000000000000002 = 7f80 000016 = infinity 1 11111111 000000000000000000000002 = ff80 000016 = −infinity 0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3.14159274101257324 ≈ π ( pi ) 0 01111101 010101010101010101010112 = 3eaa aaab16 ≈ 0.333333343267440796 ≈ 1/3 x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (on x86 and ARM processors) x 11111111 000000000000000000000012 = ff80 000116 = sNaN (on x86 and ARM processors)
По умолчанию 1/3 округляется вверх, а не вниз, как двойная точность , из-за четного числа битов в мантиссе. Биты 1/3 после точки округления 1010...
что составляет более 1/2 единицы на последнем месте .
Кодировки qNaN и sNaN не указаны в IEEE 754 и реализованы по-разному на разных процессорах. Процессоры семейства x86 и семейства ARM используют старший бит поля мантиссы для обозначения тихого NaN. Процессоры PA-RISC используют этот бит для обозначения сигнального NaN.
Оптимизации
[ редактировать ]Формат с плавающей запятой допускает различные оптимизации благодаря простому генерированию аппроксимации логарифма по основанию 2 из целочисленного представления необработанного битового шаблона. Целочисленная арифметика и битовый сдвиг могут дать приближение к обратному квадратному корню ( быстрый обратный квадратный корень ), что обычно требуется в компьютерной графике .
См. также
[ редактировать ]- ИЭЭЭ 754
- ISO/IEC 10967 , независимая от языка арифметика.
- Примитивный тип данных
- Численная стабильность
- Научное обозначение
Ссылки
[ редактировать ]- ^ «РЕАЛЬНОЕ заявление» . scc.ustc.edu.cn. Архивировано из оригинала 24 февраля 2021 г. Проверено 28 февраля 2013 г.
- ^ «CLHS: Тип SHORT-FLOAT, SINGLE-FLOAT, DOUBLE FLOAT...» www.lispworks.com .
- ^ «Примитивные типы данных» . Java-документация .
- ^ «6 предопределенных типов и классов» . Haskell.org . 20 июля 2010 г.
- ^ "Плавать" . Документация разработчика Apple .
- ^ Уильям Кахан (1 октября 1997 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 4. Архивировано из оригинала (PDF) 8 февраля 2012 года.