Формат чисел с плавающей точкой одинарной точности (иногда называемый FP32 или float32 ) — это компьютерный числовой формат , обычно занимающий 32 бита в памяти компьютера ; он представляет широкий динамический диапазон числовых значений с использованием плавающей запятой .
Переменная с плавающей точкой может представлять более широкий диапазон чисел, чем переменная с фиксированной точкой той же разрядности за счет точности. Знаковая 32-битная целая переменная имеет максимальное значение 2 31 − 1 = 2 147 483 647, тогда как 32-битная переменная с плавающей точкой IEEE 754 с основанием 2 имеет максимальное значение (2 − 2 −23 ) × 2 127 ≈ 3,4028235 × 10 38 . Все целые числа с семью или менее десятичными цифрами и любые 2 n для целого числа −149 ≤ n ≤ 127 могут быть точно преобразованы в значение с плавающей точкой одинарной точности IEEE 754.
В стандарте IEEE 754 32-битный формат с основанием 2 официально называется binary32 ; в IEEE 754-1985 он назывался single . IEEE 754 определяет дополнительные типы с плавающей точкой, такие как 64-битные представления с основанием 2 двойной точности и, в последнее время, представления с основанием 10.
Одним из первых языков программирования, предоставляющих типы данных с плавающей точкой одинарной и двойной точности, был Fortran . До широкого принятия 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 Pascal ( Delphi ), Visual Basic и MATLAB . Однако float в Python , Ruby , PHP и OCaml и single в версиях Octave до 3.2 относятся к числам с двойной точностью . В большинстве реализаций PostScript и некоторых встроенных системах единственной поддерживаемой точностью является single.
Стандарт IEEE 754 определяет binary32 как имеющий:
Это дает точность от 6 до 9 значащих десятичных цифр . Если десятичная строка с максимум 6 значащими цифрами преобразуется в формат одинарной точности IEEE 754, давая обычное число , а затем преобразуется обратно в десятичную строку с тем же количеством цифр, конечный результат должен соответствовать исходной строке. Если число одинарной точности IEEE 754 преобразуется в десятичную строку с минимум 9 значащими цифрами, а затем преобразуется обратно в представление одинарной точности, конечный результат должен соответствовать исходному числу. [6]
Бит знака определяет знак числа, который также является знаком мантиссы. Поле экспоненты представляет собой 8-битное целое число без знака от 0 до 255 в смещенной форме : значение 127 представляет фактическую экспоненту, равную нулю. Экспоненты находятся в диапазоне от −126 до +127 (таким образом, от 1 до 254 в поле экспоненты), поскольку смещенные значения экспоненты 0 (все нули) и 255 (все единицы) зарезервированы для специальных чисел ( субнормальные числа , нули со знаком , бесконечности и NaN ).
Истинная мантисса обычных чисел включает 23 дробных бита справа от двоичной точки и неявный ведущий бит (слева от двоичной точки) со значением 1. Субнормальные числа и нули (являющиеся числами с плавающей точкой, меньшими по величине, чем наименьшее положительное нормальное число) представлены смещенным значением экспоненты 0, что дает неявному ведущему биту значение 0. Таким образом, в формате памяти появляются только 23 дробных бита мантиссы , но общая точность составляет 24 бита (эквивалентно log 10 (2 24 ) ≈ 7,225 десятичных цифр).
Биты расположены следующим образом:
Действительное значение, принимаемое заданными 32-битными двоичными данными32 с заданным знаком , смещенной экспонентой e (8-битное целое число без знака) и 23-битной дробью , равно
что дает
В этом примере:
таким образом:
Примечание:
Двоичная экспонента с плавающей точкой одинарной точности кодируется с использованием двоичного представления смещения , при этом нулевое смещение равно 127; в стандарте IEEE 754 это также известно как смещение экспоненты.
Таким образом, чтобы получить истинную экспоненту, определенную смещением-двоичным представлением, смещение 127 необходимо вычесть из сохраненной экспоненты.
Сохраненные показатели 00 H и FF H интерпретируются особым образом.
Минимальное положительное нормальное значение равно , а минимальное положительное (субнормальное) значение равно .
В общем случае, строгое преобразование (включая округление) действительного числа в эквивалентный ему двоичный формат binary32 можно найти в самом стандарте IEEE 754.
Здесь мы можем показать, как преобразовать действительное число с основанием 10 в двоичный формат IEEE 75432, используя следующую схему:
Преобразование дробной части: Рассмотрим 0,375, дробную часть числа 12,375. Чтобы преобразовать его в двоичную дробь, умножьте дробь на 2, возьмите целую часть и повторите с новой дробью на 2, пока не будет найдена дробь, равная нулю, или пока не будет достигнут предел точности, который составляет 23 цифры дроби для формата IEEE 754 binary32.
Мы видим, что может быть точно представлено в двоичном виде как . Не все десятичные дроби могут быть представлены в виде конечной двоичной дроби. Например, десятичная дробь 0,1 не может быть представлена в двоичном виде точно, только приблизительно. Поэтому:
Поскольку формат IEEE 754 binary32 требует представления действительных значений в формате (см. Нормализованное число , Денормализованное число ), 1100.011 сдвигается вправо на 3 цифры, чтобы стать
Наконец мы видим, что:
Из чего мы делаем вывод:
Из них мы можем сформировать результирующее 32-битное двоичное представление формата IEEE 754 для числа 12,375:
Примечание: рассмотрите возможность преобразования 68.123 в формат IEEE 754 binary32: используя описанную выше процедуру, вы ожидаете получить число с последними 4 битами, равными 1001. Однако из-за поведения округления по умолчанию в формате IEEE 754 вы получите число с последними 4 битами, равными 1010.
Пример 1: Рассмотрим десятичную дробь 1. Мы видим, что:
Из чего мы делаем вывод:
Из них мы можем сформировать результирующее 32-битное двоичное представление формата IEEE 754 для действительного числа 1:
Пример 2: Рассмотрим значение 0,25. Мы видим, что:
Из чего мы делаем вывод:
Из них мы можем сформировать результирующее 32-битное двоичное представление формата IEEE 754 для действительного числа 0,25:
Пример 3: Рассмотрим значение 0,375. Мы увидели, что
Следовательно, определив представление 0,375, мы можем действовать, как указано выше:
Из них мы можем сформировать результирующее 32-битное двоичное представление формата IEEE 754 для действительного числа 0,375:
Если значение binary32, в данном примере 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 11111111111111111111111111 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 1111111111111111111111111 2 = 7f7f ffff 16 = 2 127 × (2 − 2 −23 ) ≈ 3,4028234664 × 10 38 (наибольшее нормальное число)
0 01111110 1111111111111111111111111 2 = 3f7f ffff 16 = 1 − 2 −24 ≈ 0,999999940395355225 (наибольшее число меньше единицы)
0 01111111 0000000000000000000000000 2 = 3f80 0000 16 = 1 (один)
0 01111111 00000000000000000000001 2 = 3f80 0001 16 = 1 + 2 −23 ≈ 1,00000011920928955 (наименьшее число больше единицы)
1 10000000 00000000000000000000000 2 = с000 0000 16 = −20 00000000 00000000000000000000000 2 = 0000 0000 16 = 01 00000000 00000000000000000000000 2 = 8000 0000 16 = −0 0 11111111 0000000000000000000000000 2 = 7f80 0000 16 = бесконечность1 11111111 0000000000000000000000000 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 1000000000000000000000001 2 = ffc0 0001 16 = qNaN (на процессорах x86 и ARM)x 11111111 0000000000000000000000001 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 из целочисленного представления необработанного битового шаблона. Целочисленная арифметика и сдвиг битов могут дать аппроксимацию обратного квадратного корня ( быстрый обратный квадратный корень ), обычно требуемую в компьютерной графике .