Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

IEEE 754-1985 [1] был отраслевым стандартом для представления чисел с плавающей запятой в компьютерах , официально принятым в 1985 году и замененным в 2008 году IEEE 754-2008 , а затем снова в 2019 году второстепенной версией IEEE 754-2019 . [2] В течение 23 лет это был наиболее широко используемый формат для вычислений с плавающей запятой. Он был реализован программно в виде библиотек с плавающей запятой и аппаратно в инструкциях многих процессоров и FPU . Первая интегральная схемадля реализации проекта того, что должно было стать IEEE 754-1985, был Intel 8087 .

IEEE 754-1985 представляет числа в двоичном формате , предоставляя определения для четырех уровней точности, из которых наиболее часто используются два:

Стандарт также определяет представления для положительной и отрицательной бесконечности , « отрицательного нуля », пяти исключений для обработки недопустимых результатов, таких как деление на ноль , специальных значений, называемых NaN, для представления этих исключений, денормальных чисел для представления чисел, меньших, чем показано выше, и четырех округлений. режимы.

Представление чисел [ править ]

Число 0,12625, представленное как число с плавающей запятой одинарной точности IEEE 754-1985. См. Текст для объяснения.
Три поля в 64-битном IEEE 754 с плавающей запятой

Числа с плавающей запятой в формате IEEE 754 состоят из трех полей: бит знака , смещенная экспонента и дробь. Следующий пример иллюстрирует значение каждого из них.

Десятичное число 0,15625 10, представленное в двоичном формате, равно 0,00101 2 (то есть 1/8 + 1/32). (Нижние индексы указывают основание числа .) Аналогично экспоненциальному представлению , где числа записываются так, чтобы слева от десятичной точки была одна ненулевая цифра, мы переписываем это число так, чтобы оно содержало один бит слева от двоичная точка ». Мы просто умножаем на соответствующую степень 2, чтобы компенсировать сдвиг битов влево на три позиции:

Теперь мы можем считать дробь и показатель степени: дробь равна 0,01 2, а показатель степени равен −3.

Как показано на рисунках, три поля в представлении этого числа в стандарте IEEE 754:

sign = 0, потому что число положительное. (1 означает отрицательное.)
смещенная экспонента = −3 + «смещение». При одинарной точности смещение составляет 127 , поэтому в этом примере смещенная экспонента равна 124; при двойной точности смещение составляет 1023 , поэтому смещенная экспонента в этом примере равна 1020.
дробь = 0,01000… 2 .

IEEE 754 добавляет смещение к экспоненте, так что во многих случаях числа можно удобно сравнивать с помощью того же оборудования, которое сравнивает целые числа с дополнением до 2 со знаком . При использовании смещенной экспоненты меньшее из двух положительных чисел с плавающей запятой будет «меньше» большего, следуя тому же порядку, что и для целых чисел со знаком и величиной . Если два числа с плавающей запятой имеют разные знаки, сравнение знака и величины также работает со смещенными показателями. Однако, если оба числа с плавающей запятой со смещенной экспонентой отрицательны, то порядок должен быть изменен на обратный. Если бы показатель степени был представлен, скажем, числом с дополнением до 2, сравнение, чтобы увидеть, какое из двух чисел больше, было бы не столь удобным.

Бит 1 в начале опускается, поскольку все числа, кроме нуля, начинаются с 1; ведущая 1 является неявной и на самом деле не нуждается в хранении, что дает дополнительную точность «бесплатно».

Ноль [ править ]

Число ноль представлено особым образом:

sign = 0 для положительного нуля , 1 для отрицательного нуля .
смещенная экспонента = 0.
фракция = 0.

Денормализованные числа [ править ]

Представления чисел, описанные выше, называются нормализованными, что означает, что неявная ведущая двоичная цифра - 1. Чтобы уменьшить потерю точности при возникновении потери значимости , IEEE 754 включает возможность представления дробей, меньших, чем это возможно в нормализованном представлении, путем выполнения неявная ведущая цифра a 0. Такие числа называются денормальными . Они не включают в себя столько значащих цифр, как нормализованное число, но они допускают постепенную потерю точности, когда результат арифметической операции не совсем равен нулю, но слишком близок к нулю, чтобы быть представленным нормализованным числом.

Денормальное число представлено смещенным показателем степени всех 0 битов, который представляет показатель степени -126 с одинарной точностью (не -127) или -1022 с двойной точностью (не -1023). [3] Напротив, наименьшая смещенная экспонента, представляющая нормальное число, равна 1 (см. Примеры ниже).

Представление нечисловых [ править ]

Поле смещенной экспоненты заполняется всеми 1 битами, чтобы указать либо бесконечность, либо недопустимый результат вычисления.

Положительная и отрицательная бесконечность [ править ]

Положительная и отрицательная бесконечность представлены таким образом:

sign = 0 для положительной бесконечности, 1 для отрицательной бесконечности.
смещенная экспонента = все 1 бит.
фракция = все 0 бит.

NaN [ править ]

Некоторые операции арифметики с плавающей запятой недопустимы, например извлечение квадратного корня из отрицательного числа. Достижение недопустимого результата называется исключением с плавающей запятой . Исключительный результат представлен специальным кодом, который называется NaN, что означает « не число ». Все NaN в IEEE 754-1985 имеют следующий формат:

знак = либо 0, либо 1.
смещенная экспонента = все 1 бит.
дробь = что угодно, кроме всех 0 бит (поскольку все 0 бит представляют бесконечность).

Диапазон и точность [ править ]

Относительная точность одинарных (binary32) и двойной точности (binary64) чисел по сравнению с десятичными представлениями, использующими фиксированное количество значащих цифр . Относительная точность определяется здесь как ulp ( x ) / x , где ulp ( x ) - это единица на последнем месте в представлении x , то есть промежуток между x и следующим представимым числом.

Точность определяется как минимальная разница между двумя последовательными представлениями мантиссы; таким образом, это функция только мантиссы; в то время как разрыв определяется как разница между двумя последовательными числами. [4]

Одинарная точность [ править ]

Числа с одинарной точностью занимают 32 бита. С одинарной точностью:

  • Положительные и отрицательные числа, наиболее близкие к нулю (представленные денормализованным значением со всеми нулями в поле экспоненты и двоичным значением 1 в поле дроби):
    ± 2 −23 × 2 −126 ≈ ± 1,40130 × 10 −45
  • Положительные и отрицательные нормализованные числа, наиболее близкие к нулю (представленные двоичным значением 1 в поле экспоненты и 0 в поле дроби):
    ± 1 × 2 −126 ≈ ± 1,17549 × 10 −38
  • Конечные положительные и конечные отрицательные числа, наиболее удаленные от нуля (представленные значением 254 в поле экспоненты и всеми единицами в поле дробей), являются
    ± (2−2 −23 ) × 2 127 [5] ≈ ± 3,40282 × 10 38

Некоторые примеры значений диапазона и разрыва для заданных показателей с одинарной точностью:

Например, 16 777 217 нельзя закодировать как 32-битное число с плавающей запятой, так как оно будет округлено до 16 777 216. Это показывает, почему арифметика с плавающей запятой не подходит для бухгалтерского программного обеспечения. Однако все целые числа в пределах представимого диапазона, которые являются степенью двойки, могут быть сохранены в 32-битном веществе с плавающей запятой без округления.

Двойная точность [ править ]

Числа двойной точности занимают 64 бита. С двойной точностью:

  • Положительные и отрицательные числа, наиболее близкие к нулю (представленные денормализованным значением со всеми нулями в поле Exp и двоичным значением 1 в поле Fraction):
    ± 2 −52 × 2 −1022 ≈ ± 4.94066 × 10 −324
  • Положительные и отрицательные нормализованные числа, наиболее близкие к нулю (представленные двоичным значением 1 в поле Exp и 0 в поле дроби):
    ± 1 × 2 −1022 ≈ ± 2.22507 × 10 −308
  • Конечные положительные и конечные отрицательные числа, наиболее удаленные от нуля (представленные значением с 2046 в поле Exp и всеми единицами в поле дробей) являются
    ± (2−2 −52 ) × 2 1023 [5] ≈ ± 1,79769 × 10 308

Некоторые примеры значений диапазона и разрыва для заданных показателей с двойной точностью:

Расширенные форматы [ править ]

Стандарт также рекомендует использовать расширенный формат (ы) для выполнения внутренних вычислений с более высокой точностью, чем та, которая требуется для окончательного результата, чтобы минимизировать ошибки округления: стандарт определяет только минимальные требования к точности и показателю для таких форматов. X87 80-битный расширенный формат является наиболее часто реализуется расширенный формат , который отвечает этим требованиям.

Примеры [ править ]

Вот несколько примеров представлений IEEE 754 с одинарной точностью:

Сравнение чисел с плавающей запятой [ править ]

Каждая возможная битовая комбинация - это либо NaN, либо число с уникальным значением в аффинно расширенной системе действительных чисел с соответствующим порядком, за исключением двух комбинаций битов для отрицательного нуля и положительного нуля, которые иногда требуют особого внимания (см. Ниже) . Бинарное представление имеет особое свойство , что, за исключением NaNs, любые два числа можно сравнить , как знак и величину целых ( порядка следования байтов проблемы относятся). При сравнении как дополнение до 2целые числа: если биты знака различаются, отрицательное число предшествует положительному, поэтому дополнение до 2 дает правильный результат (за исключением того, что отрицательный ноль и положительный ноль следует считать равными). Если оба значения положительны, сравнение дополнения до 2 снова дает правильный результат. В противном случае (два отрицательных числа) правильный порядок FP противоположен порядку дополнения до 2.

Ошибки округления, присущие вычислениям с плавающей запятой, могут ограничивать использование сравнений для проверки точного равенства результатов. Выбор приемлемого диапазона - сложная тема. Распространенным методом является использование эпсилон-значения сравнения для приблизительного сравнения. [6] В зависимости от того, насколько мягкими являются сравнения, общие значения включают 1e-6либо 1e-5одинарную точность, либо 1e-14двойную точность. [7] [8] Другой распространенный метод - ULP, который проверяет разницу в цифрах последнего разряда, эффективно проверяя, сколько шагов отстоят от двух значений. [9]

Хотя отрицательный ноль и положительный ноль обычно считаются равными для целей сравнения, некоторые операторы отношения в языке программирования и подобные конструкции рассматривают их как разные. Согласно спецификации языка Java [10] операторы сравнения и равенства рассматривают их как равные, но и различают их (официально начиная с версии Java 1.1, но фактически с 1.1.1), как и методы сравнения , и даже классы и .Math.min()Math.max()equals()compareTo()compare()FloatDouble

Округление чисел с плавающей запятой [ править ]

Стандарт IEEE имеет четыре различных режима округления; первый - значение по умолчанию; остальные называются направленными округлениями .

  • Round to Nearest - округление до ближайшего значения; если число падает на полпути, оно округляется до ближайшего значения с четным (нулевым) наименее значимым битом, что означает, что оно округляется в большую сторону в 50% случаев (в IEEE 754-2008 этот режим называется roundTiesToEven, чтобы отличить его от другого раунда. -до-ближайший режим)
  • Round into 0 - направленное округление к нулю
  • Round к + ∞ - направленное округление в сторону положительной бесконечности
  • Округлить к −∞ - направленное округление к отрицательной бесконечности.

Расширение действительных чисел [ править ]

Стандарт IEEE использует (и расширяет) аффинно расширенную систему действительных чисел с отдельными положительными и отрицательными бесконечностями. Во время разработки было предложено включить в стандарт проективно расширенную систему действительных чисел с единственной бесконечностью без знака, предоставив программистам возможность выбора режима. Однако в интересах снижения сложности окончательного стандарта проективный режим был исключен. В Intel 8087 и Intel 80287 с плавающей точкой сопроцессоров и поддерживают этот режим проективного. [11] [12] [13]

Функции и предикаты [ править ]

Стандартные операции [ править ]

Должны быть предусмотрены следующие функции:

  • Сложить, вычесть, умножить, разделить
  • Квадратный корень
  • Остаток с плавающей запятой. Это не похоже на обычную операцию по модулю , она может быть отрицательной для двух положительных чисел. Он возвращает точное значение x– (round (x / y) · y) .
  • Округлить до ближайшего целого числа . Для неориентированного округления, когда между двумя целыми числами выбирается четное число.
  • Операции сравнения. Помимо более очевидных результатов, IEEE 754 определяет, что −∞ = −∞, + ∞ = + ∞ и x  ≠  NaNдля любого x (включая NaN).

Рекомендуемые функции и предикаты [ править ]

  • copysign(x,y)возвращает x со знаком y, поэтому abs(x)равно copysign(x,1.0). Это одна из немногих операций, которые работают с NaN наподобие арифметических. Эта функция copysignявляется новой в стандарте C99.
  • −x возвращает x с обратным знаком. В некоторых случаях это отличается от 0 − x, особенно когда x равно 0. Итак, - (0) равно −0, но знак 0−0 зависит от режима округления.
  • scalb(y, N)
  • logb(x)
  • finite(x)предикат для «х конечное значение», что эквивалентно -Inf <х <Inf
  • isnan(x) предикат для «x is a NaN», эквивалентный «x ≠ x»
  • x <> y, который, как оказалось, ведет себя иначе, чем NOT (x = y) из-за NaN.
  • unordered(x, y) истинно, когда «x не упорядочен с y», т. е. либо x, либо y являются NaN.
  • class(x)
  • nextafter(x,y) возвращает следующее представимое значение от x в направлении y

История [ править ]

В 1976 году Intel приступила к разработке сопроцессора с плавающей запятой . [14] [15] Intel надеялась, что сможет продать чип, содержащий хорошие реализации всех операций, обнаруженных в самых разных библиотеках математического программного обеспечения. [14] [16]

Джон Палмер, руководивший проектом, убедил их, что они должны попытаться разработать стандарт для всех своих операций с плавающей запятой. Он связался с Уильямом Каханом из Калифорнийского университета , который помог повысить точность калькуляторов Hewlett-Packard . Кахан предложил Intel использовать плавающую точку VAX корпорации Digital Equipment Corporation (DEC). Первый VAX, VAX-11/780, вышел только в конце 1977 года, и его числа с плавающей запятой пользовались большим успехом. Однако, стремясь вывести свой чип на как можно более широкий рынок, Intel хотела получить наилучшие возможные операции с плавающей запятой, и Кахан продолжил разработку спецификаций. [14]Кахан изначально рекомендовал использовать десятичную систему с плавающей запятой [17], но аппаратная часть сопроцессора была слишком далеко продвинута, чтобы вносить это изменение.

Работа внутри Intel обеспокоила других поставщиков, которые начали усилия по стандартизации, чтобы обеспечить «равные условия игры». Кахан присутствовал на втором заседании рабочей группы по стандартам IEEE 754, состоявшемся в ноябре 1977 года. Здесь он получил разрешение от Intel выдвинуть проект предложения, основанный на стандартной арифметической части их проекта сопроцессора; ему было разрешено объяснять проектные решения Intel и их основную аргументацию, но ничего, связанного с архитектурой реализации Intel. [14] [15] [16] [18]

Поскольку 8-битная экспонента была недостаточно широкой для некоторых операций, необходимых для чисел с двойной точностью, например, для хранения произведения двух 32-битных чисел [19], как предложение Кахана, так и встречное предложение DEC использовали 11 бит, как проверенные временем на 60-битной плавающей точкой формата от CDC 6600 от 1965 г. [15] [18] [20] предложение Kahan также предусмотрено бесконечностями, которые полезны при работе с разделением на ноль условий; нечисловые значения, которые полезны при работе с недопустимыми операциями; денормальные числа , которые помогают смягчить проблемы, вызванные недостаточным заполнением; [18] [21] [22] и более сбалансированное смещение экспоненты, что может помочь избежать переполнения и потери значимости при взятии обратной величины числа. [23] [24]

Еще до утверждения проект стандарта был внедрен рядом производителей. [25] [26] Intel 8087, анонсированный в 1980 году, был первым чипом, реализующим проект стандарта.

Сопроцессор Intel 8087 с плавающей запятой

В 1980 году уже был выпущен чип Intel 8087 [27], но DEC по-прежнему выступала против денормальных чисел, в частности, из-за проблем с производительностью и поскольку это дало бы DEC конкурентное преимущество за счет стандартизации формата DEC.

Споры о постепенном истощении запасов продолжались до 1981 года, когда эксперт, нанятый DEC для оценки, выступил против несогласных. DEC провела исследование, чтобы продемонстрировать, что постепенное истощение ресурсов - плохая идея, но исследование пришло к противоположному выводу, и DEC сдалась. В 1985 году стандарт был ратифицирован, но уже стал стандартом де-факто годом ранее. реализуется многими производителями. [15] [18] [28]

См. Также [ править ]

  • IEEE 754
  • Minifloat для простых примеров свойств чисел с плавающей запятой IEEE 754
  • Арифметика с фиксированной точкой

Заметки [ править ]

  1. ^ Точность: количество десятичных цифр точности рассчитывается с помощью number_of_mantissa_bits * Log 10 (2). Таким образом, ~ 7,2 и ~ 15,9 для одинарной и двойной точности соответственно.

Ссылки [ править ]

  1. ^ Стандарт IEEE для двоичной арифметики с плавающей запятой . 1985. DOI : 10,1109 / IEEESTD.1985.82928 . ISBN 0-7381-1165-1.
  2. ^ "ANSI / IEEE Std 754-2019" . 754r.ucbtest.org . Проверено 6 августа 2019 .
  3. ^ Хеннесси (2009). Компьютерная организация и дизайн . Морган Кауфманн. п. 270 .
  4. ^ Хоссам А. Х. Фахми; Шломо Васер; Майкл Дж. Флинн, Компьютерная арифметика (PDF) , архивировано из оригинала (PDF) 08.10.2010 , получено 02.01.2011
  5. ^ а б Уильям Кахан . «Лекционные заметки о статусе IEEE 754» (PDF) . 1 октября 1997 г., 3:36. Избрать. Англ. И Калифорнийский университет компьютерных наук . Проверено 12 апреля 2007 . Cite journal requires |journal= (help)
  6. ^ "Годо math_funcs.h" . GitHub.com .
  7. ^ "Годо math_defs.h" . GitHub.com .
  8. ^ "Godot MathfEx.cs" . GitHub.com .
  9. ^ «Сравнение чисел с плавающей запятой, издание 2012 г.» . randomascii.wordpress.com .
  10. ^ «Спецификации языка Java и виртуальных машин» . Документация по Java .
  11. Джон Р. Хаузер (март 1996 г.). «Обработка исключений с плавающей точкой в ​​числовых программах» (PDF) . Транзакции ACM по языкам и системам программирования . 18 (2): 139–174. DOI : 10.1145 / 227699.227701 . S2CID 9820157 .  
  12. ^ Дэвид Стивенсон (март 1981). «IEEE Task P754: Предлагаемый стандарт для двоичной арифметики с плавающей запятой». Компьютер IEEE . 14 (3): 51–62. DOI : 10.1109 / CM.1981.220377 .
  13. ^ Уильям Кахан и Джон Палмер (1979). «О предлагаемом стандарте с плавающей запятой». Информационный бюллетень SIGNUM . 14 (Специальный): 13–21. DOI : 10.1145 / 1057520.1057522 . S2CID 16981715 . 
  14. ^ a b c d «Intel и Floating-Point - Обновление одного из самых успешных отраслевых стандартов - Технологическое видение стандарта Floating-Point» (PDF) . Intel . 2016. Архивировано из оригинального (PDF) 04 марта 2016 года . Проверено 30 мая 2016 . (11 страниц)
  15. ^ a b c d "Интервью со Стариком Плавающей Точки" . cs.berkeley.edu. 1998-02-20 . Проверено 30 мая 2016 .
  16. ^ a b Woehr, Джек, изд. (1997-11-01). «Разговор с Уильямом Каханом» . Доктора Добба . drdobbs.com . Проверено 30 мая 2016 .
  17. ^ W. Kahan 2003, личн. комм. чтобы Майк Коулишо и другие после 754 встречи IEEE [ ненадежный источник? ]
  18. ^ a b c d "IEEE 754: Интервью с Уильямом Каханом" (PDF) . dr-chuck.com . Проверено 2 июня 2016 .
  19. ^ «IEEE против двоичного формата Microsoft; проблемы с округлением (полностью)» . Служба поддержки Microsoft . Microsoft . 21 ноября 2006 г. Идентификатор статьи KB35826, Q35826. Архивировано 28 августа 2020 года . Проверено 24 февраля 2010 .
  20. ^ Торнтон, Джеймс Э. (1970). Написано в Лаборатории перспективного дизайна, Control Data Corporation. Дизайн компьютера: данные управления 6600 (PDF) (1-е изд.). Гленвью, Иллинойс, США: Скотт, Форесман и компания . LCCN 74-96462 . Архивировано (PDF) из оригинала 28 августа 2020 года . Проверено 2 июня 2016 .   (1 + 13 + 181 + 2 + 2 страницы)
  21. ^ Кахан, Уильям Мортон . «Зачем нам нужен стандарт арифметики с плавающей запятой?» (PDF) . cs.berkeley.edu . Проверено 2 июня 2016 .
  22. ^ Кахан, Уильям Мортон ; Дарси, Джозеф Д. "Как плавающая точка в Java причиняет боль всем и везде" (PDF) . cs.berkeley.edu . Проверено 2 июня 2016 .
  23. ^ Тернер, Питер Р. (2013-12-21). Численный анализ и параллельная обработка: лекции, прочитанные в Ланкастере… . ISBN 978-3-66239812-8. Проверено 30 мая 2016 .
  24. ^ «Имена для стандартизированных форматов с плавающей запятой» (PDF) . cs.berkeley.edu . Проверено 2 июня 2016 .
  25. Чарльз Северанс (20 февраля 1998 г.). «Интервью со Стариком Плавающей Точки» .
  26. ^ Чарльз Северанс . «История формата чисел с плавающей запятой IEEE» . Связи.
  27. ^ "Молекулярные выражения: наука, оптика и вы - Olympus MIC-D: Галерея интегральных схем - Математический сопроцессор Intel 8087" . micro.magnet.fsu.edu . Проверено 30 мая 2016 .
  28. ^ Кахан, Уильям Мортон . «Стандарт IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . cs.berkeley.edu . Проверено 2 июня 2016 .

Дальнейшее чтение [ править ]

  • Чарльз Северанс (март 1998 г.). «IEEE 754: Интервью с Уильямом Каханом» (PDF) . Компьютер IEEE . 31 (3): 114–115. DOI : 10,1109 / MC.1998.660194 . S2CID  33291145 . Архивировано из оригинального (PDF) 23 августа 2009 года . Проверено 28 апреля 2008 .
  • Дэвид Голдберг (март 1991 г.). «Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой» (PDF) . ACM Computing Surveys . 23 (1): 5–48. DOI : 10.1145 / 103162.103163 . S2CID  222008826 . Проверено 28 апреля 2008 .
  • Крис Хеккер (февраль 1996 г.). «Давайте перейдем к (плавающей) точке» (PDF) . Журнал разработчика игр : 19–24. ISSN  1073-922X . Архивировано из оригинального (PDF) 03 февраля 2007 года.
  • Давид Моннио (май 2008 г.). «Подводные камни проверки вычислений с плавающей запятой» . Транзакции ACM по языкам и системам программирования . 30 (3): 1–41. arXiv : cs / 0701192 . DOI : 10.1145 / 1353445.1353446 . ISSN  0164-0925 . S2CID  218578808 .: Краткое изложение неинтуитивного поведения операций с плавающей запятой на популярных архитектурах с последствиями для проверки и тестирования программ.

Внешние ссылки [ править ]

  • Сравнение поплавков
  • Coprocessor.info: изображения x87 FPU, информация о разработке и производителе
  • IEEE 854-1987 - История и протоколы
  • Онлайн-конвертер IEEE754 (одинарная и двойная точность)