stringtranslate.com

Формат с плавающей запятой одинарной точности

Формат чисел с плавающей запятой одинарной точности (иногда называемый 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

Стандарт 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 интерпретируются особым образом.

Минимальное положительное нормальное значение — и минимальное положительное (субнормальное) значение — .

Преобразование десятичной дроби в двоичную32

В общем, обратитесь к самому стандарту IEEE 754 для строгого преобразования (включая поведение округления) действительного числа в его эквивалентный форматbinary32.

Здесь мы можем показать, как преобразовать вещественное число по основанию 10 в формат Binary32 IEEE 754, используя следующую схему:

Преобразование дробной части: Рассмотрим 0,375, дробную часть 12,375. Чтобы преобразовать ее в двоичную дробь, умножьте дробь на 2, возьмите целую часть и повторите с новой дробью на 2, пока не будет найдена нулевая дробь или пока не будет достигнут предел точности, который составляет 23 цифры дроби для формата IEEE 754binary32. .

, целая часть представляет цифру двоичной дроби. Чтобы продолжить, умножьте 0,750 на 2.
, дробь = 0,011, прекратить

Мы видим, что это можно точно представить в двоичном виде как . Не все десятичные дроби можно представить в виде конечной двоичной дроби. Например, десятичное число 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 в десятичное

Если значение бинарного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 — мантисса.

Ограничения точности десятичных значений (от 1 до 16777216)

Ограничения точности целочисленных значений

Известные случаи одинарной точности

Эти примеры даны в битовом представлении , в шестнадцатеричном и двоичном формате , значения с плавающей запятой. Сюда входят знак, (смещенный) показатель и мантисса.

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 из целочисленного представления необработанного битового шаблона. Целочисленная арифметика и битовый сдвиг могут дать приближение к обратному квадратному корню ( быстрый обратный квадратный корень ), что обычно требуется в компьютерной графике .

Смотрите также

Рекомендации

  1. ^ "НАСТОЯЩЕЕ ЗАЯВЛЕНИЕ" . scc.ustc.edu.cn. _ Архивировано из оригинала 24 февраля 2021 г. Проверено 28 февраля 2013 г.
  2. ^ "CLHS: Тип SHORT-FLOAT, SINGLE-FLOAT, DOUBLE FLOAT..."
  3. ^ «Примитивные типы данных». Java-документация .
  4. ^ «6 предопределенных типов и классов» . Haskell.org . 20 июля 2010 г.
  5. ^ «Плавание». Документация разработчика Apple .
  6. ^ Уильям Кахан (1 октября 1997 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 4.

Внешние ссылки