Jump to content

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

(Перенаправлено с Float32 )

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

Стандарт IEEE 754: двоичный32

[ редактировать ]

Стандарт IEEE 754 определяет двоичный файл32 как имеющий:

Это дает точность от 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.

Таким образом, чтобы получить истинный показатель степени, определенный в двоичном представлении смещения, смещение 127 необходимо вычесть из сохраненного показателя степени.

Сохраненные показатели степени 00 H и FF H интерпретируются особым образом.

Экспонента дробь = 0 дробь ≠ 0 Уравнение
00H = 00000000 2 ±zero субнормальное число
01 H , ..., FE H = 00000001 2 , ..., 11111110 2 нормальное значение
ФФ Ч = 11111111 2 ± infinity NaN (тихо, сигнализация)

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

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

[ редактировать ]

В общем, обратитесь к самому стандарту 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-битное представление формата Binary32 IEEE 754 для числа 12,375:

Примечание. Рассмотрите возможность преобразования 68.123 в формат IEEE 754binary32. Используя описанную выше процедуру, вы ожидаете получить последние 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 в десятичное

[ редактировать ]

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

См. также

[ редактировать ]
  1. ^ «РЕАЛЬНОЕ заявление» . scc.ustc.edu.cn. ​Архивировано из оригинала 24 февраля 2021 г. Проверено 28 февраля 2013 г.
  2. ^ «CLHS: Тип SHORT-FLOAT, SINGLE-FLOAT, DOUBLE FLOAT...» www.lispworks.com .
  3. ^ «Примитивные типы данных» . Java-документация .
  4. ^ «6 предопределенных типов и классов» . Haskell.org . 20 июля 2010 г.
  5. ^ "Плавать" . Документация разработчика Apple .
  6. ^ Уильям Кахан (1 октября 1997 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 4. Архивировано из оригинала (PDF) 8 февраля 2012 года.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f9ce5bc16b917593c3a575f1bab67784__1721911140
URL1:https://arc.ask3.ru/arc/aa/f9/84/f9ce5bc16b917593c3a575f1bab67784.html
Заголовок, (Title) документа по адресу, URL1:
Single-precision floating-point format - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)