Формат чисел с плавающей запятой одинарной точности (иногда называемый 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 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 в Fortran , [1] SINGLE-FLOAT в Common Lisp , [2] float в C , C++ , C# , Java , [3] Float в Haskell [4] и Swift , [5] и Single в Object Паскаль ( Delphi ), Visual Basic и MATLAB . Однако числа с плавающей запятой в Python , Ruby , PHP и OCaml и одиночные в версиях Octave до 3.2 относятся к числам двойной точности . В большинстве реализаций PostScript и некоторых встроенных системах поддерживается только одинарная точность.
Стандарт IEEE 754 определяет двоичный файл32 как имеющий:
Это дает точность от 6 до 9 значащих десятичных цифр . Если десятичная строка, содержащая не более 6 значащих цифр, преобразуется в формат одинарной точности IEEE 754, давая нормальное число, а затем преобразуется обратно в десятичную строку с тем же количеством цифр, конечный результат должен соответствовать исходной строке. Если число IEEE 754 с одинарной точностью преобразуется в десятичную строку, содержащую не менее 9 значащих цифр, а затем преобразуется обратно в представление с одинарной точностью, конечный результат должен соответствовать исходному числу. [6]
Знаковый бит определяет знак числа, который также является знаком мантиссы. Экспонента представляет собой 8-битное целое число без знака от 0 до 255 в смещенной форме : значение экспоненты 127 представляет фактический ноль. Показатели степени варьируются от -126 до +127, поскольку показатели степени -127 (все 0) и +128 (все 1) зарезервированы для специальных чисел.
Истинная мантисса включает 23 дробных бита справа от двоичной точки и неявный ведущий бит (слева от двоичной точки) со значением 1, если только показатель степени не хранится со всеми нулями. Таким образом, в формате памяти появляются только 23 дробных бита мантиссы , но общая точность составляет 24 бита (что эквивалентно log 10 (2 24 ) ≈ 7,225 десятичных цифр). Биты расположены следующим образом:
Реальное значение, принимаемое данными 32-битными двоичными32 данными с заданным знаком , смещенным показателем степени e (8-битное целое число без знака) и 23-битной дробью, равно
который дает
В этом примере:
таким образом:
Примечание:
Двоичная экспонента с плавающей запятой одинарной точности кодируется с использованием двоичного представления смещения, при этом нулевое смещение равно 127; также известное как смещение экспоненты в стандарте IEEE 754.
Таким образом, чтобы получить истинный показатель степени, определенный в двоичном представлении смещения, смещение 127 необходимо вычесть из сохраненного показателя степени.
Сохраненные показатели степени 00 H и FF H интерпретируются особым образом.
Минимальное положительное нормальное значение — и минимальное положительное (субнормальное) значение — .
В общем, обратитесь к самому стандарту IEEE 754 для строгого преобразования (включая поведение округления) действительного числа в его эквивалентный форматbinary32.
Здесь мы можем показать, как преобразовать вещественное число по основанию 10 в формат Binary32 IEEE 754, используя следующую схему:
Преобразование дробной части: Рассмотрим 0,375, дробную часть 12,375. Чтобы преобразовать ее в двоичную дробь, умножьте дробь на 2, возьмите целую часть и повторите с новой дробью на 2, пока не будет найдена нулевая дробь или пока не будет достигнут предел точности, который составляет 23 цифры дроби для формата IEEE 754binary32. .
Мы видим, что это можно точно представить в двоичном виде как . Не все десятичные дроби можно представить в виде конечной двоичной дроби. Например, десятичное число 0,1 не может быть представлено в двоичном формате точно, а только приблизительно. Поэтому:
Поскольку формат IEEE 754binary32 требует, чтобы в формате были представлены действительные значения (см. Нормализованное число , Денормализованное число ), 1100,011 сдвигается вправо на 3 цифры, чтобы стать
Наконец мы видим это:
Из чего делаем вывод:
Из них мы можем сформировать результирующее 32-битное представление формата Binary32 IEEE 754 для числа 12,375:
Примечание. Рассмотрите возможность преобразования 68.123 в формат IEEE 754binary32. Используя описанную выше процедуру, вы ожидаете получить последние 4 бита, равные 1001. Однако из-за поведения округления по умолчанию в формате IEEE 754 вы получаете , последние 4 бита которого равны 1010.
Пример 1: Рассмотрим десятичную дробь 1. Мы видим, что:
Из чего делаем вывод:
Из них мы можем сформировать результирующее представление действительного числа 1 в 32-битном формате IEEE 754binary32:
Пример 2. Рассмотрим значение 0,25. Мы видим, что:
Из чего делаем вывод:
Из них мы можем сформировать результирующее 32-битное представление формата IEEE 754binary32 действительного числа 0,25:
Пример 3: Рассмотрим значение 0,375. Мы видели это
Следовательно, после определения представления 0,375 мы можем действовать, как указано выше:
Из них мы можем сформировать результирующее 32-битное представление формата IEEE 754binary32 действительного числа 0,375:
Если значение бинарного32, 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бит 17 = 0,015625..бит 6 = 0,00000762939453125бит 5 = 0,000003814697265625бит 4 = 0,0000019073486328125бит 3 = 0,00000095367431640625бит 2 = 0,000000476837158203125бит 1 = 0,0000002384185791015625бит 0 = 0,00000011920928955078125
Мантисса в этом примере имеет три бита: бит 23, бит 22 и бит 19. Теперь мы можем декодировать мантиссу, складывая значения, представленные этими битами.
Затем нам нужно умножить основание 2 в степени экспоненты, чтобы получить окончательный результат:
Таким образом
Это эквивалентно:
где s — знаковый бит, x — показатель степени, а m — мантисса.
Эти примеры даны в битовом представлении , в шестнадцатеричном и двоичном формате , значения с плавающей запятой. Сюда входят знак, (смещенный) показатель и мантисса.
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 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 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 = −бесконечность 0 10000000 10010010000111111011011 2 = 4049 0fdb 16 ≈ 3,14159274101257324 ≈ π (пи)0 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.
Формат с плавающей запятой допускает различные оптимизации благодаря простому генерированию аппроксимации логарифма по основанию 2 из целочисленного представления необработанного битового шаблона. Целочисленная арифметика и битовый сдвиг могут дать приближение к обратному квадратному корню ( быстрый обратный квадратный корень ), что обычно требуется в компьютерной графике .