stringtranslate.com

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

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

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

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

Преобразование десятичного числа в двоичное32

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

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

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

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

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

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

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

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

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

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

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

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

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

Ссылки

  1. ^ "REAL Statement". scc.ustc.edu.cn . Архивировано из оригинала 2021-02-24 . Получено 2013-02-28 .
  2. ^ "CLHS: Тип SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT..." www.lispworks.com .
  3. ^ "Примитивные типы данных". Документация Java .
  4. ^ "6 предопределенных типов и классов". haskell.org . 20 июля 2010 г.
  5. ^ "Float". Документация разработчика Apple .
  6. Уильям Кахан (1 октября 1997 г.). «Конспект лекций о состоянии стандарта IEEE 754 для двоичной арифметики с плавающей точкой» (PDF) . стр. 4. Архивировано из оригинала (PDF) 8 февраля 2012 г.

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