Jump to content

ИЭЭЭ 754

Стандарт IEEE для арифметики с плавающей запятой ( IEEE 754 ) — это технический стандарт для арифметики с плавающей запятой, установленный в 1985 году Институтом инженеров по электротехнике и электронике (IEEE). В стандарте решены многие проблемы, обнаруженные в различных реализациях операций с плавающей запятой, которые затрудняют их надежное и переносимое использование . Многие аппаратные устройства с плавающей запятой используют стандарт IEEE 754.

Стандарт определяет:

  • арифметические форматы: наборы двоичных и десятичных данных с плавающей запятой, которые состоят из конечных чисел (включая нули со знаком и субнормальные числа ), бесконечностей и специальных значений «не числа» ( NaNs ).
  • форматы обмена: кодировки (битовые строки), которые можно использовать для обмена данными с плавающей запятой в эффективной и компактной форме.
  • правила округления: свойства, которые должны соблюдаться при округлении чисел во время арифметических операций и преобразований.
  • операции: арифметические и другие операции (например, тригонометрические функции ) над арифметическими форматами.
  • обработка исключений: индикация исключительных условий (таких как деление на ноль , переполнение и т.д. )

IEEE 754-2008 , опубликованный в августе 2008 года, включает почти весь исходный стандарт IEEE 754-1985 , а также стандарт IEEE 854-1987 для независимой от системы счисления арифметики с плавающей запятой . Текущая версия IEEE 754-2019 была опубликована в июле 2019 года. [1] Это незначительная доработка предыдущей версии, включающая в себя, главным образом, уточнения, исправления дефектов и новые рекомендуемые операции.

Потребность в стандарте с плавающей запятой возникла из-за хаоса в индустрии бизнеса и научных вычислений в 1960-х и 1970-х годах. IBM использовала шестнадцатеричный формат с плавающей запятой с более длинным мантиссом и более коротким показателем степени. [ нужны разъяснения ] . CDC и Cray Компьютеры использовали представление дополнения , которое допускает значения +0 и -0. 60-битные компьютеры CDC не имели полных 60-битных сумматоров, поэтому целочисленная арифметика была ограничена 48 битами точности от блока с плавающей запятой. Обработка исключений от деления на ноль была разной на разных компьютерах. Перемещение данных между системами и даже повторение одних и тех же вычислений в разных системах зачастую было затруднительно.

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

Новая версия, IEEE 754-2008 , была опубликована в августе 2008 года после семилетнего процесса пересмотра под председательством Дэна Зураса и под редакцией Майка Коулишоу . Он заменил как IEEE 754-1985 (двоичная арифметика с плавающей запятой), так и стандарт IEEE 854-1987 для независимой от основания арифметики с плавающей запятой . Двоичные форматы исходного стандарта включены в этот новый стандарт вместе с тремя новыми базовыми форматами: одним двоичным и двумя десятичными. Чтобы соответствовать текущему стандарту, реализация должна реализовать хотя бы один из основных форматов как арифметический формат, так и формат обмена.

Международный стандарт ISO/IEC/IEEE 60559:2011 (содержание идентично IEEE 754-2008) одобрен для принятия через ISO / IEC JTC 1 /SC 25 в соответствии с Соглашением ISO/IEEE PSDO. [2] [3] и опубликовано. [4]

Текущая версия IEEE 754-2019, опубликованная в июле 2019 года, является производной от IEEE 754-2008 и заменяет ее после процесса пересмотра, начатого в сентябре 2015 года под председательством Дэвида Г. Хафа и под редакцией Майка Коулишоу. Он включает в себя в основном пояснения (например, totalOrder ) и исправления дефектов (например, minNum ), но также включает некоторые новые рекомендуемые операции (например, augmentedAddition ). [5] [6]

Международный стандарт ISO/IEC 60559:2020 (с содержанием, идентичным IEEE 754-2019) был одобрен для принятия через ISO/IEC JTC 1 /SC 25 и опубликован. [7]

Следующая прогнозируемая редакция стандарта запланирована на 2028 год. [8]

IEEE 754 Формат представляет собой «набор представлений числовых значений и символов». Формат может также включать способ кодирования набора. [9]

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

  • основание (также называемое системой счисления ) b , которое в IEEE 754 равно 2 (двоичному) или 10 (десятичному);
  • точность p ;
  • диапазон показателя степени от emin до emax , где emin = 1 − emax или, что эквивалентно, emin = − ( emax − 1) для всех форматов IEEE 754.

Формат включает в себя

  • Конечные числа, которые можно описать тремя целыми числами: s = знак (ноль или единица), c = мантисса (или коэффициент ), имеющий не более p цифр при записи в системе счисления b (т. е. целое число в диапазоне до 0). б п − 1), а q = показатель степени такой, что emin q + p − 1 ⩽ emax . Числовое значение такого конечного числа равно (−1) с × в × б д . [а] Более того, существуют два нулевых значения, называемые нулями со знаком : бит знака определяет, равен ли ноль +0 (положительный ноль) или -0 (отрицательный ноль).
  • Две бесконечности: +∞ и −∞.
  • Два вида NaN (не-числа): тихий NaN (qNaN) и сигнальный NaN (sNaN).

Например, если b = 10, p = 7 и emax = 96, то emin = −95, мантисса удовлетворяет 0 ≤ c 9  999  999 , а показатель степени удовлетворяет −101 ≤ q ≤ 90 . Следовательно, наименьшее ненулевое положительное число, которое можно представить, равно 1×10. −101 , а самый большой — 9999999×10. 90 (9.999999×10 96 ), поэтому полный диапазон чисел равен −9,999999×10. 96 через 9,999999×10 96 . Числа — б 1- емакс и б 1- емакс (здесь −1×10 −95 и 1×10 −95 ) — наименьшие (по величине) нормальные числа ; ненулевые числа между этими наименьшими числами называются субнормальными числами .

Представление и кодирование в памяти

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

Некоторые числа могут иметь несколько возможных представлений с плавающей запятой. Например, если b = 10 и p = 7, то -12,345 можно представить как -12345×10. −3 , −123450×10 −4 , и -1234500×10 −5 . Однако для большинства операций, таких как арифметические операции, результат (значение) не зависит от представления входных данных.

Для десятичных форматов допустимо любое представление, и набор этих представлений называется когортой . Когда результат может иметь несколько представлений, стандарт определяет, какой член когорты выбирается.

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

Из-за возможности множественного кодирования (по крайней мере, в форматах, называемых форматами обмена ), NaN может нести другую информацию: знаковый бит (который не имеет значения, но может использоваться некоторыми операциями) и полезную нагрузку , которая предназначена для диагностики. информация, указывающая источник NaN (но полезная нагрузка может иметь и другие применения, например NaN-бокс). [10] [11] [12] ).

Базовые и обменные форматы

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

Стандарт определяет пять основных форматов, названных в честь их числовой базы и количества бит, используемых в их кодировке обмена. Существует три основных формата двоичных чисел с плавающей запятой (закодированных 32, 64 или 128 битами) и два базовых формата десятичных чисел с плавающей запятой (закодированных 64 или 128 битами). Форматы двоичный32 и двоичный64 представляют собой одинарный и двойной форматы IEEE 754-1985 соответственно. Соответствующая реализация должна полностью реализовывать хотя бы один из базовых форматов.

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

Значение Экспонента Характеристики [б]
Имя Общее имя Радикс Цифры [с] Десятичные цифры [д] Мин Макс МАКСВАЛ войти 10   МАКСВАЛ МИНВАЛ >0 (нормальный) МИНВАЛ >0 (субнорма) Примечания
двоичный16 Половинная точность 2 11 3.31 −14 15 65504 4.816 6.10·10 −5 5.96·10 −8 Развязка
двоичный32 Одинарная точность 2 24 7.22 −126 +127 3.40·10 38 38.532 1.18·10 −38 1.40·10 −45 Базовый
двоичный64 Двойная точность 2 53 15.95 −1022 +1023 1.80·10 308 308.255 2.23·10 −308 4.94·10 −324 Базовый
двоичный128 Четырехкратная точность 2 113 34.02 −16382 +16383 1.19·10 4932 4932.075 3.36·10 −4932 6.48·10 −4966 Базовый
двоичный256 Восьмеричная точность 2 237 71.34 −262142 +262143 1.61·10 78913 78913.207 2.48·10 −78913 2.25·10 −78984 Развязка
десятичное32 10 7 7 −95 +96 1.0·10 97 97 − 4.34·10 −8 1·10 −95 1·10 −101 Развязка
десятичная дробь64 10 16 16 −383 +384 1.0·10 385 385 − 4.34·10 −17 1·10 −383 1·10 −398 Базовый
десятичное128 10 34 34 −6143 +6144 1.0·10 6145 6145 − 4.34·10 −35 1·10 −6143 1·10 −6176 Базовый

В таблице выше целочисленные значения являются точными, тогда как значения в десятичной записи (например, 1,0) являются округленными значениями. Указанные минимальные показатели степени относятся к нормальным числам; специальное представление субнормальных чисел позволяет представлять даже меньшие (по величине) числа с некоторой потерей точности. Например, наименьшее положительное число, которое можно представить в двоичном формате 64, равно 2. −1074 ; вклады в цифру -1074 включают значение emin -1022 и все 53 бита значащего значения, кроме одного (2 −1022 − (53 − 1)  = 2 −1074 ).

Десятичные цифры — это точность формата, выраженная в эквивалентном количестве десятичных цифр. Оно вычисляется как цифры × log 10 по основанию . Например, двоичный128 имеет примерно ту же точность, что и 34-значное десятичное число.

log 10   MAXVAL — это мера диапазона кодирования. Его целая часть представляет собой наибольший показатель степени, отображаемый на выходе значения в экспоненциальном представлении с одной ведущей цифрой в мантиссе перед десятичной запятой (например, 1,698 · 10 38 находится рядом с наибольшим значением в двоичном формате32, 9,999999 · 10 96 — самое большое десятичное значение32).

Форматы двоичный32 (одинарный) и двоичный64 (двойной) — два наиболее распространенных формата, используемых сегодня. На рисунке ниже показана абсолютная точность для обоих форматов в диапазоне значений. Этот рисунок можно использовать для выбора подходящего формата с учетом ожидаемого значения числа и требуемой точности.

Точность двоичных32 и двоичных64 в диапазоне 10. −12 до 10 12

Пример макета для 32-битной плавающей запятой :

и 64-битная раскладка аналогична.

Расширенные и расширяемые прецизионные форматы

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

Стандарт определяет дополнительные расширенные и расширяемые форматы точности, которые обеспечивают большую точность, чем базовые форматы. [14] Формат расширенной точности расширяет базовый формат за счет большей точности и большего диапазона показателей. Расширяемый формат точности позволяет пользователю указывать диапазон точности и показателя степени. Реализация может использовать любое внутреннее представление таких форматов по своему выбору; все, что необходимо определить, — это его параметры ( b , p и emax ). Эти параметры однозначно описывают набор конечных чисел (комбинаций знака, мантиссы и показателя степени для данного основания), которые он может представлять.

Стандарт рекомендует, чтобы языковые стандарты предоставляли метод указания p и emax для каждой поддерживаемой базы b . [15] Стандарт рекомендует, чтобы языковые стандарты и реализации поддерживали расширенный формат, который имеет большую точность, чем самый большой базовый формат, поддерживаемый для каждого основания счисления b . [16] Для расширенного формата с точностью между двумя базовыми форматами диапазон экспоненты должен быть таким же большим, как и у следующего более широкого базового формата. Так, например, 64-битное двоичное число расширенной точности должно иметь значение Emax не менее 16383. x87 80-битный расширенный формат соответствует этому требованию.

Исходный стандарт IEEE 754-1985 также содержал концепцию расширенных форматов , но без какой-либо обязательной связи между emin и emax . Например, Motorola 68881 , 80-битный формат [17] где emin = − emax был соответствующим расширенным форматом, но стал несоответствующим в версии 2008 года.

Форматы обмена

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

Форматы обмена предназначены для обмена данными с плавающей запятой с использованием битовой строки фиксированной длины для данного формата.

Двоичный

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

Для обмена двоичными числами с плавающей запятой обменивайтесь форматами длиной 16 бит, 32 бита, 64 бита и любыми кратными 32 битам ≥ 128. [и] определены. 16-битный формат предназначен для обмена или хранения небольших чисел (например, для графики).

Схема кодирования для этих форматов двоичного обмена такая же, как в IEEE 754-1985: бит знака, за которым следуют w битов экспоненты, которые описывают смещение экспоненты на смещение , и p - 1 битов, которые описывают мантиссу. Ширина поля экспоненты для k -битного формата вычисляется как w = round(4 log 2 ( k )) − 13. Существующие 64- и 128-битные форматы следуют этому правилу, но 16- и 32-битные форматы форматы имеют больше битов экспоненты (5 и 8 соответственно), чем дает эта формула (3 и 7 соответственно).

Как и в IEEE 754-1985, поле смещенной экспоненты заполняется всеми битами 1, чтобы указать либо бесконечность (конечное поле мантиссы = 0), либо NaN (конечное поле мантиссы ≠ 0). Для NaN тихие NaN и сигнальные NaN различаются использованием исключительно старшего бита конечного поля мантиссы, [ф] а полезная нагрузка передается в оставшихся битах.

Десятичный

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

Для обмена десятичными числами с плавающей запятой определены форматы обмена, кратные 32 битам. Как и в случае двоичного обмена, схема кодирования десятичных форматов обмена кодирует знак, показатель степени и мантиссу. Определены две разные кодировки на уровне битов, и обмен осложняется тем, что может потребоваться некоторый внешний индикатор используемой кодировки.

Эти два параметра позволяют кодировать мантиссу как сжатую последовательность десятичных цифр с использованием плотно упакованных десятичных чисел или, альтернативно, как двоичное целое число . Первый более удобен для прямой аппаратной реализации стандарта, а второй больше подходит для программной эмуляции на бинарном компьютере. В любом случае набор чисел (комбинации знака, мантиссы и показателя степени), которые могут быть закодированы, идентичен, а специальные значения (±ноль с минимальным показателем, ±бесконечность, тихие NaN и сигнальные NaN) имеют идентичное кодирование.

Правила округления

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

Стандарт определяет пять правил округления. Первые два правила округляются до ближайшего значения; остальные называются направленными округлениями :

Округление до ближайшего

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

В крайних случаях значение с величиной строго меньше будет округлено до минимального или максимального конечного числа (в зависимости от знака значения). Любые числа именно этой величины считаются ничьими; этот выбор галстука можно представить как середину между и , которые, если бы показатель степени не был ограничен, были бы следующими представимыми числами с плавающей запятой, большими по величине. Числа, величина которых строго больше k, округляются до соответствующей бесконечности. [18]

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

Направленные округления

[ редактировать ]
  • Округление к 0 – направленное округление к нулю (также известное как усечение ).
  • Округление в сторону +∞ – направленное округление в сторону положительной бесконечности (также известное как округление вверх или к потолку ).
  • Округление в сторону −∞ – направленное округление в сторону отрицательной бесконечности (также известное как округление вниз или до пола ).
Пример округления до целых чисел с использованием правил IEEE 754
Режим Пример значения
+11.5 +12.5 −11.5 −12.5
к ближайшему, привязан к четному +12.0 +12.0 −12.0 −12.0
до ближайшего, привязано к нулю +12.0 +13.0 −12.0 −13.0
к 0 +11.0 +12.0 −11.0 −12.0
в сторону +∞ +12.0 +13.0 −11.0 −12.0
в сторону −∞ +11.0 +12.0 −12.0 −13.0

Если не указано иное, результат операции с плавающей запятой определяется применением функции округления к бесконечно точному (математическому) результату. Такая операция называется корректным округлением . Это требование называется правильным округлением . [20]

Необходимые операции

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

К обязательным операциям для поддерживаемого арифметического формата (включая базовые форматы) относятся:

  • Преобразования в целое число и обратно [21] [22]
  • Предыдущие и следующие последовательные значения [21]
  • Арифметические операции (сложение, вычитание, умножение, деление, квадратный корень, объединенное умножение-сложение , остаток, минимум, максимум) [21] [22]
  • Преобразования (между форматами, в строки и обратно и т. д. ) [23] [24]
  • Масштабирование и (для десятичных чисел) квантование [25] [26]
  • Копирование и манипулирование знаком (абс, отрицание и т. д. ) [27]
  • Сравнения и общий порядок [28] [29]
  • Классификация чисел (субнормальные, конечные и т. д. ) и проверка на NaN. [30]
  • Тестирование и установка флагов состояния [31]

Предикаты сравнения

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

Стандарт предоставляет предикаты сравнения для сравнения одних данных с плавающей запятой с другими в поддерживаемом арифметическом формате. [32] Любое сравнение с NaN считается неупорядоченным. −0 и +0 сравниваются как равные.

Предикат полного порядка

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

Стандарт предоставляет предикат totalOrder , который определяет общий порядок канонических членов поддерживаемого арифметического формата. [33] Предикат согласуется с предикатами сравнения (см. раздел § Предикаты сравнения ), когда одно число с плавающей запятой меньше другого. Основные различия: [34]

  • NaN сортируем.
    • NaN обрабатывается так, как если бы его абсолютное значение было больше, чем Infinity (или любые другие числа с плавающей запятой). (-NaN < -Бесконечность; +Бесконечность < +NaN.)
    • qNaN и sNaN обрабатываются так, как если бы qNaN имел большее абсолютное значение, чем sNaN. (−qNaN < −sNaN; +sNaN < +qNaN.)
    • Затем NaN сортируется в соответствии с полезной нагрузкой. В IEEE 754-2008 NaN с меньшей полезной нагрузкой рассматривается как имеющий меньшее абсолютное значение. В IEEE 754-2019 допускается любой порядок, определяемый реализацией.
  • Отрицательный ноль считается меньшим, чем положительный ноль.
  • Если обе стороны сравнения относятся к одному и тому же элементу данных с плавающей запятой, то тот, у которого меньший показатель степени, считается имеющим меньшее абсолютное значение. [33]

Предикат totalOrder не накладывает полный порядок на все кодировки в формате. В частности, он не различает разные кодировки одного и того же представления с плавающей запятой, например, когда одна или обе кодировки неканоничны. [33] IEEE 754-2019 включает разъяснения totalOrder .

Для форматов двоичного обмена, кодирование которых соответствует рекомендациям IEEE 754-2008 по размещению сигнального бита NaN , сравнение идентично тому, которое тип преобразует числа с плавающей запятой в целое число со знаком и величиной (при условии, что порядок полезной нагрузки соответствует этому сравнение), старый прием для сравнения FP без FPU. [35]

Обработка исключений

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

Стандарт определяет пять исключений, каждое из которых возвращает значение по умолчанию и имеет соответствующий флаг состояния, который возникает при возникновении исключения. [г] Никакой другой обработки исключений не требуется, но рекомендуются дополнительные альтернативы, отличные от стандартных (см. § Альтернативная обработка исключений ).

Пять возможных исключений:

  • Недопустимая операция: математически неопределенная, например , квадратный корень из отрицательного числа. По умолчанию возвращает qNaN.
  • Деление на ноль: операция с конечными операндами дает точный бесконечный результат, например , 1/0 или log(0). По умолчанию возвращает ±бесконечность.
  • Переполнение: конечный результат слишком велик для точного представления ( т. е . его показатель с неограниченным диапазоном показателей будет больше, чем emax ). По умолчанию возвращает ±бесконечность для режимов округления до ближайшего (и следует правилам округления для режимов направленного округления).
  • Недостаток: результат очень мал (вне нормального диапазона). По умолчанию возвращает число, меньшее или равное минимальному положительному нормальному числу по величине (согласно правилам округления); всегда Ненормальное число подразумевает исключение недостаточности, но по умолчанию, если оно точное, флаг не поднимается.
  • Неточно: точный ( т. е . неокругленный) результат невозможно представить точно. По умолчанию возвращает правильно округленный результат.

Это те же пять исключений, которые были определены в IEEE 754-1985, но исключение деления на ноль было распространено на операции, отличные от деления.

Некоторые реализации десятичных чисел с плавающей запятой определяют дополнительные исключения. [36] [37] которые не являются частью IEEE 754:

  • Зафиксировано: показатель степени результата слишком велик для формата назначения. По умолчанию к коэффициенту добавляются конечные нули, чтобы уменьшить показатель степени до наибольшего полезного значения. Если это невозможно (поскольку это приведет к тому, что количество необходимых цифр превысит формат назначения), возникает исключение переполнения.
  • Округлено: для коэффициента результата требуется больше цифр, чем предусмотрено форматом назначения. Неточное исключение сигнализируется, если какие-либо ненулевые цифры отбрасываются.

Кроме того, такие операции, как квантование, когда любой из операндов бесконечен или когда результат не соответствует формату назначения, также будут сигнализировать об исключении недопустимой операции. [38]

Особые значения

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

Знаковый ноль

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

В стандарте IEEE 754 ноль имеет знак, что означает, что существуют как «положительный ноль» (+0), так и «отрицательный ноль» (-0). В большинстве сред выполнения положительный ноль обычно печатается как « 0" и отрицательный ноль как " -0". Эти два значения ведут себя как равные при числовом сравнении, но некоторые операции возвращают разные результаты для +0 и -0. Например, 1/(-0) возвращает отрицательную бесконечность, а 1/(+0) возвращает положительную бесконечность (так что тождество ∞) сохраняется 1 ) / ± ± что ( 1 = . / Главный квадратный корень из y + xi для любого отрицательного числа y Как и в любой схеме аппроксимации, операции с «отрицательным нулем» могут иногда вызывать путаницу. Например, в IEEE 754 x = y не всегда подразумевает 1/ x = 1/. y , поскольку 0 = −0 , но 1/0 ≠ 1/(−0) . [39]

Субнормальные числа

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

Субнормальные значения заполняют пробел нижнего уровня значениями, где абсолютное расстояние между ними такое же, как и для соседних значений сразу за пределами пробела нижнего уровня. Это улучшение по сравнению со старой практикой, когда в промежутке нижнего переполнения просто был нуль, а результаты нижнего переполнения заменялись нулем (сброс до нуля). [40]

Современное оборудование с плавающей запятой обычно обрабатывает субнормальные значения (а также нормальные значения) и не требует программной эмуляции для субнормальных значений.

Бесконечности

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

Бесконечности расширенной линии действительных чисел могут быть представлены в типах данных IEEE с плавающей запятой, точно так же, как обычные значения с плавающей запятой, такие как 1, 1,5 и т. д. Они никоим образом не являются значениями ошибок, хотя часто (зависит от округления) ) используются в качестве замещающих значений при переполнении. При исключении деления на ноль в качестве точного результата возвращается положительная или отрицательная бесконечность. Бесконечность также может быть представлена ​​как цифра (например, макрос «INFINITY» в C или « », если язык программирования допускает такой синтаксис).

IEEE 754 требует разумной обработки бесконечностей, например:

  • (+∞) + (+7) = (+∞)
  • (+∞) × (−2) = (−∞)
  • (+∞) × 0 = NaN – нет смысла делать

IEEE 754 определяет специальное значение, называемое «Не число» (NaN), которое должно быть возвращено в результате определенных «недопустимых» операций, таких как 0/0, ∞×0 или sqrt(-1). В общем, значения NaN будут распространяться, т. е. большинство операций, включающих NaN, приведут к результату NaN, хотя функции, которые дают определенный результат для любого заданного значения с плавающей запятой, будут делать то же самое и для NaN, например NaN ^ 0 = 1. Существует два типа NaN: тихие NaN по умолчанию и, опционально, сигнальные NaN. Сигнализация NaN в любой арифметической операции (включая числовые сравнения) вызовет исключения сигнализацию «недопустимой операции».

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

Обоснование дизайна

[ редактировать ]
Уильям Кахан . Главный разработчик сопроцессора Intel 80x87 с плавающей запятой и стандарта операций с плавающей запятой IEEE 754.

Распространенным заблуждением является то, что более экзотические особенности стандарта IEEE 754, обсуждаемые здесь, такие как расширенные форматы, NaN, бесконечности, субнормальные числа и т. д., представляют интерес только для числовых аналитиков или для продвинутых числовых приложений. На самом деле верно обратное: эти функции предназначены для обеспечения безопасных и надежных настроек по умолчанию для неискушенных в числовых вычислениях программистов, а также для поддержки сложных числовых библиотек экспертами. Главный разработчик IEEE 754 Уильям Кахан отмечает, что неверно «... [считать] функции стандарта IEEE 754 для двоичной арифметики с плавающей запятой, которые ... [не считаются] функциями, которые могут использоваться только числовыми Эксперты говорят об обратном. В 1977 году эти функции были заложены в процессоре Intel 8087, чтобы обслуживать максимально широкий рынок... Анализ ошибок подсказывает нам, как разработать арифметику с плавающей запятой, подобную стандарту IEEE 754, умеренно толерантную к хорошим. -значит невежество среди программистов». [41]

  • Специальные значения, такие как бесконечность и NaN, гарантируют, что арифметика с плавающей запятой является алгебраически полной: каждая операция с плавающей запятой дает четко определенный результат и по умолчанию не вызывает машинного прерывания или прерывания. Более того, выбор специальных значений, возвращаемых в исключительных случаях, был разработан для того, чтобы во многих случаях дать правильный ответ. Например, согласно арифметике IEEE 754, непрерывные дроби, такие как R(z) := 7 - 3/[z - 2 - 1/(z - 7 + 10/[z - 2 - 2/(z - 3)]) ] даст правильный ответ на всех входных данных, поскольку деление потенциала на ноль, например, для z = 3 , правильно обрабатывается заданием +бесконечности, и поэтому такие исключения можно безопасно игнорировать. [42] Как отметил Кахан, необработанная ловушка, последовавшая за переполнением при преобразовании чисел с плавающей запятой в 16-битные целые числа, которая привела к потере ракеты Ariane 5, не произошла бы при стандартной политике IEEE 754 с плавающей запятой. [41]
  • Субнормальные числа гарантируют, что для конечных чисел с плавающей запятой x и y x - y = 0 тогда и только тогда, когда x = y, как и ожидалось, но что не выполнялось в более ранних представлениях с плавающей запятой. [43]
  • По поводу обоснования разработки 80-битного формата x87 Кахан отмечает: «Этот расширенный формат предназначен для использования с незначительной потерей скорости для всех операций, кроме простейшей арифметики с операндами с плавающей точкой и двойными операндами. Например, его следует использовать для чистых переменных в циклах, которые реализуют повторения, такие как полиномиальная оценка, скалярные произведения, частичные и непрерывные дроби. Это часто предотвращает преждевременное переполнение/недополнение или серьезную локальную отмену, которая может испортить простые алгоритмы». [44] Вычисление промежуточных результатов в расширенном формате с высокой точностью и расширенным показателем степени имеет прецеденты в исторической практике научных вычислений и в конструкции научных калькуляторов , например, Hewlett-Packard выполняли финансовые калькуляторы арифметические и финансовые функции с точностью до трех значащих десятичных знаков, чем они сохраняли. или отображается. [44] Реализация расширенной точности позволила легко разработать стандартные библиотеки элементарных функций, которые обычно давали результаты двойной точности в пределах одной единицы в последнем месте (ULP) на высокой скорости.
  • Правильное округление значений до ближайшего представимого значения позволяет избежать систематических погрешностей в расчетах и ​​замедляет рост ошибок. Округление связей даже устраняет статистическую погрешность, которая может возникнуть при сложении аналогичных цифр.
  • Направленное округление было задумано как средство проверки границ ошибок, например, в интервальной арифметике . Он также используется при реализации некоторых функций.
  • Математическая основа операций, в частности правильное округление, позволяет доказать математические свойства и разработать алгоритмы с плавающей запятой, такие как 2Sum, Fast2Sum и алгоритм суммирования Кахана , например, для повышения точности или относительно простой реализации арифметических подпрограмм с многократной точностью.

Свойством форматов одинарной и двойной точности является то, что их кодирование позволяет легко сортировать их без использования аппаратных средств с плавающей запятой, как если бы биты представляли целые числа со знаком и величиной , хотя неясно, было ли это конструктивным соображением (это Кажется примечательным, что более раннее шестнадцатеричное представление IBM с плавающей запятой также имело это свойство для нормализованных чисел). При распространенном с дополнением до двух представлении интерпретация битов как целых чисел со знаком правильно сортирует положительные значения, но с обратным расположением отрицательных значений; в качестве одного из возможных исправлений этого, с помощью xor, чтобы перевернуть знаковый бит для положительных значений и все биты для отрицательных значений, все значения становятся сортируемыми как целые числа без знака (с −0 < +0 ). [35]

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

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

Альтернативная обработка исключений

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

Стандарт рекомендует необязательную обработку исключений в различных формах, включая предварительную замену пользовательских значений по умолчанию, ловушки (исключения, которые каким-то образом изменяют поток управления) и другие модели обработки исключений, которые прерывают поток, такие как try/catch. Ловушки и другие механизмы исключений остаются необязательными, как и в IEEE 754-1985.

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

Пункт 9 стандарта рекомендует дополнительные математические операции. [45] которые должны определять языковые стандарты. [46] Ничто не требуется для соответствия стандарту.

Ниже приведены рекомендуемые арифметические операции, которые необходимо правильно округлять: [47]

The , и функции не были частью стандарта IEEE 754-2008, поскольку считались менее необходимыми. [49] и были упомянуты, но это было расценено как ошибка. [5] Все три были добавлены в редакцию 2019 года.

Рекомендуемые операции также включают установку и доступ к направлению округления в динамическом режиме, [50] и определяемые реализацией операции векторного сокращения, такие как сумма, масштабированное произведение и скалярное произведение , точность которых не указана стандартом. [51]

По состоянию на 2019 год , расширенные арифметические операции [52] для двоичных форматов также рекомендуется. Эти операции, предназначенные для сложения, вычитания и умножения, создают пару значений, состоящих из результата, правильно округленного до ближайшего в формате, и члена ошибки, который точно может быть представлен в этом формате. На момент публикации стандарта аппаратные реализации неизвестны, но очень похожие операции уже были реализованы в программном обеспечении с использованием известных алгоритмов. История и мотивация их стандартизации объяснены в справочном документе. [53] [54]

С 2019 года ранее обязательные minNum , maxNum , minNumMag и maxNumMag в IEEE 754-2008 теперь устарели из-за их неассоциативности . Вместо этого рекомендуется использовать два набора новых минимальных и максимальных операций. [55] Первый набор содержит минимум , минимум , максимум и максимум . Второй набор содержит минимальное значение , минимальное значение , максимальное значение и максимальное значение . История и мотивация этого изменения объяснены в справочном документе. [56]

Оценка выражения

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

Стандарт рекомендует, как языковые стандарты должны определять семантику последовательностей операций, и указывает на тонкости буквальных значений и оптимизаций, которые меняют значение результата. Напротив, предыдущая версия стандарта 1985 года оставляла неопределенными аспекты языкового интерфейса, что приводило к несогласованному поведению между компиляторами или к разным уровням оптимизации в оптимизирующем компиляторе .

Языки программирования должны позволять пользователю указывать минимальную точность для промежуточных вычислений выражений для каждого основания. В стандарте это называется предпочтительной шириной , и должна быть возможность устанавливать ее для каждого блока отдельно. Промежуточные вычисления внутри выражений следует рассчитывать и сохранять все временные значения, используя максимальную ширину операндов и предпочтительную ширину, если она установлена. Так, например, компилятор, предназначенный для аппаратного обеспечения с плавающей запятой x87, должен иметь возможность указать, что промежуточные вычисления должны использовать двойное расширение формата . Сохраненное значение переменной всегда должно использоваться при вычислении последующих выражений, а не любого предшественника, полученного до округления и присвоения переменной.

Воспроизводимость

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

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

Представление персонажа

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

Стандарт требует операций по преобразованию базовых форматов во внешние форматы последовательностей символов . [57] Преобразования в десятичный формат символов и обратно необходимы для всех форматов. Преобразование во внешнюю последовательность символов должно быть таким, чтобы обратное преобразование с использованием округления до ближайшего, привязки к четному восстанавливало исходное число. Нет необходимости сохранять полезную нагрузку тихого NaN или сигнального NaN, а преобразование из внешней последовательности символов может превратить сигнальный NaN в спокойный NaN.

Исходное двоичное значение будет сохранено путем преобразования в десятичное и обратно с помощью: [58]

  • 5 десятичных цифр для двоичного16,
  • 9 десятичных цифр для двоичного32,
  • 17 десятичных цифр для двоичного кода 64,
  • 36 десятичных цифр для двоичного числа 128.

Для других двоичных форматов необходимое количество десятичных цифр равно [час]

где p — количество значащих битов в двоичном формате, например 237 бит для двоичного формата256.

При использовании десятичного формата с плавающей запятой десятичное представление будет сохранено с помощью:

  • 7 десятичных цифр для decimal32,
  • 16 десятичных цифр для decimal64,
  • 34 десятичных цифры для десятичного числа 128.

Алгоритмы с кодом для правильного округления преобразования из двоичного числа в десятичное и из десятичного в двоичное обсуждаются Гей, [59] а для тестирования – Паксон и Кахан. [60]

Шестнадцатеричные литералы

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

Стандарт рекомендует обеспечивать преобразования во внешние шестнадцатерично-значащие символы и обратно на основе . шестнадцатеричных литералов с плавающей запятой C99 Такой литерал состоит из необязательного знака ( + или -), индикатор «0x», шестнадцатеричное число с точкой или без нее, индикатор степени «p» и десятичную степень с необязательным знаком. Синтаксис не чувствителен к регистру. [61] Десятичный показатель масштабируется по степени двойки, например 0x0.1p-4 составляет 1/256. [62]

См. также

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

Примечания

[ редактировать ]
  1. ^ Например, если основание равно 10, знак равен 1 (обозначает отрицательное значение), мантисса равна 12345, а показатель степени равен -3, то значение числа равно (-1). 1 × 12345 × 10 −3 = −1 × 12345 × 0.001 = −12.345.
  2. ^ Приблизительные значения. Точные значения см. в отдельной статье Википедии для каждого формата.
  3. ^ Количество цифр в используемой системе счисления, включая любые неявные цифры, но не считая знакового бита.
  4. ^ Соответствующее количество десятичных цифр, более подробную информацию см. в тексте.
  5. ^ В отличие от десятичного формата, не существует двоичного формата обмена длиной 96 бит. Однако такой формат по-прежнему разрешен как формат без обмена.
  6. ^ Стандарт рекомендует 0 для сигнальных NaN, 1 для тихих NaN, так что сигнальные NaN можно заглушить, изменив только этот бит на 1, в то время как обратное может привести к кодированию бесконечности.
  7. ^ В некоторых случаях опустошения флаг не поднимается.
  8. ^ В качестве ограничения реализации правильное округление гарантируется только для требуемого количества десятичных цифр плюс 3 для наибольшего поддерживаемого двоичного формата. Например, если двоичный32 является самым большим поддерживаемым двоичным форматом, то преобразование из десятичной внешней последовательности с 12 десятичными цифрами гарантированно будет правильно округлено при преобразовании в двоичный32; а вот преобразование последовательности из 13 десятичных цифр нет; однако стандарт рекомендует, чтобы реализации не налагали такого ограничения.
  1. ^ IEEE 754 2019 г.
  2. ^ Хаас, Джоди. «Прошивка: ISO/IEC/IEEE 60559 (IEEE Std 754-2008)» . grouper.ieee.org . Архивировано из оригинала 27 октября 2017 г. Проверено 4 апреля 2018 г.
  3. ^ «Соглашение о сотрудничестве между Партнерской организацией по разработке стандартов ISO/IEEE (PSDO)» (PDF) . ИСО. 19 декабря 2007 г. Проверено 27 декабря 2021 г.
  4. ^ ISO/IEC JTC 1/SC 25 2011 .
  5. ^ Перейти обратно: а б Коулишоу, Майк (13 ноября 2013 г.). «Ошибки стандарта IEEE 754-2008» . speleotrove.com . Проверено 24 января 2020 г.
  6. ^ «ANSI/IEEE Std 754-2019» . ucbtest.org . Проверено 16 января 2024 г.
  7. ^ ISO/IEC JTC 1/SC 25 2020 .
  8. ^ Риди, Э. Джейсон (26 июня 2018 г.), «Планы для стандарта IEEE 754–2028» (PDF) , 25-й симпозиум IEEE по компьютерной арифметике , Амхерст, Массачусетс: IEEE
  9. ^ IEEE 754 2008 , §2.1.27.
  10. ^ «Внутреннее устройство SpiderMonkey» . http://developer.mozilla.org . Проверено 11 марта 2018 г.
  11. ^ Клеменс, Бен (сентябрь 2014 г.). 21 век C: Советы C от новой школы . О'Рейли Медиа, Инкорпорейтед. п. 160. ИСБН  9781491904442 . Проверено 11 марта 2018 г.
  12. ^ "zuiderkwast/nanbox: NaN-бокс в C" . Гитхаб . Проверено 11 марта 2018 г.
  13. ^ IEEE 754 2008 , §3.6.
  14. ^ IEEE 754 2008 , §3.7.
  15. ^ IEEE 754 2008 , §3.7 гласит: «Стандарты языка должны определять механизмы, поддерживающие расширяемую точность для каждого поддерживаемого основания системы счисления».
  16. ^ IEEE 754 2008 , §3.7 гласит: «Языковые стандарты или реализации должны поддерживать формат расширенной точности, который расширяет самый широкий базовый формат, поддерживаемый в этом основании».
  17. ^ Семейство Motorola MC68000 (PDF) . Справочное руководство программиста. НХП Полупроводники. 1992. стр. 1–16, 1–18, 1–23.
  18. ^ IEEE 754 2008 , §4.3.1. «В следующих двух атрибутах направления округления бесконечно точный результат с величиной не менее округлю до без изменения знака».
  19. ^ IEEE 754 2008 , §4.3.3
  20. ^ IEEE 754 2019 , §2.1
  21. ^ Перейти обратно: а б с IEEE 754 2008 , §5.3.1
  22. ^ Перейти обратно: а б IEEE 754 2008 , §5.4.1
  23. ^ IEEE 754 2008 , §5.4.2
  24. ^ IEEE 754 2008 , §5.4.3
  25. ^ IEEE 754 2008 , §5.3.2
  26. ^ IEEE 754 2008 , §5.3.3
  27. ^ IEEE 754 2008 , §5.5.1
  28. ^ IEEE 754 2008 , §5.10
  29. ^ IEEE 754 2008 , §5.11
  30. ^ IEEE 754 2008 , §5.7.2
  31. ^ IEEE 754 2008 , §5.7.4
  32. ^ IEEE 754 2019 , §5.11
  33. ^ Перейти обратно: а б с IEEE 754 2019 , §5.10
  34. ^ «Реализовать total_cmp для f32, f64 от golddranks · Запрос на включение № 72568 · ржавчина-lang/rust» . Гитхаб . – содержит соответствующие цитаты из IEEE 754-2008 и -2019. Содержит реализацию и объяснение каламбура.
  35. ^ Перейти обратно: а б Херф, Майкл (декабрь 2001 г.). «радикс-трюки» . стереопсис: графика .
  36. ^ «9.4. decimal — Десятичная арифметика с фиксированной запятой и с плавающей запятой — Документация Python 3.6.5» . docs.python.org . Проверено 4 апреля 2018 г.
  37. ^ «Десятичная арифметика – Исключительные условия» . speleotrove.com . Проверено 4 апреля 2018 г.
  38. ^ IEEE 754 2008 , §7.2 (h)
  39. ^ Гольдберг 1991 .
  40. ^ Мюллер, Жан-Мишель; Бризебар, Николя; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Стеле, Дэмиен; Торрес, Серж (2010). Справочник по арифметике с плавающей запятой (1-е изд.). Биркхаузер . дои : 10.1007/978-0-8176-4705-6 . ISBN  978-0-8176-4704-9 . LCCN   2009939668 .
  41. ^ Перейти обратно: а б Кахан, Уильям Мортон ; Дарси, Джозеф (2001) [1998-03-01]. «Как числа с плавающей запятой в Java вредят всем и повсюду» (PDF) . Архивировано (PDF) из оригинала 16 августа 2000 г. Проверено 5 сентября 2003 г.
  42. ^ Кахан, Уильям Мортон (12 февраля 1981 г.). «Зачем нам нужен стандарт арифметики с плавающей запятой?» (PDF) . п. 26. Архивировано (PDF) из оригинала 4 декабря 2004 г.
  43. ^ Северанс, Чарльз (20 февраля 1998 г.). «Интервью со стариком, занимающимся плавающей запятой» .
  44. ^ Перейти обратно: а б Кахан, Уильям Мортон (11 июня 1996 г.). «Пагубное влияние компьютерных тестов на прикладную математику, физику и химию» (PDF) . Архивировано (PDF) из оригинала 13 октября 2013 г.
  45. ^ IEEE 754 2019 , §9.2
  46. ^ IEEE 754 2008 , пункт 9.
  47. ^ IEEE 754 2019 , §9.2.
  48. ^ «Слишком много силы — pow vs powr, powd, pown, rootn, complex» . grouper.ieee.org . Проверено 16 января 2024 г. Поскольку темпы роста не могут быть меньше -1, такие темпы сигнализируют о недопустимых исключениях.
  49. ^ «Re: Отсутствуют функции tanPi, asinPi и acosPi» . grouper.ieee.org . Архивировано из оригинала 6 июля 2017 г. Проверено 4 апреля 2018 г.
  50. ^ IEEE 754 2008 , §9.3.
  51. ^ IEEE 754 2008 , §9.4.
  52. ^ IEEE 754 2019 , §9.5
  53. ^ Риди, Джейсон; Деммел, Джеймс. «Расширенные арифметические операции, предложенные для IEEE-754 2018» (PDF) . 25-й симпозиум IEEE по компьютерной арифметике (ARITH 2018). стр. 49–56. Архивировано (PDF) из оригинала 23 июля 2019 г. Проверено 23 июля 2019 г.
  54. ^ «ANSI/IEEE Std 754-2019 – Справочная документация» . grouper.ieee.org . Проверено 16 января 2024 г.
  55. ^ IEEE 754 2019 , §9.6.
  56. ^ Чен, Дэвид. «Удаление/понижение статуса операций MinNum и MaxNum из IEEE 754-2018» (PDF) . grouper.ieee.org . Проверено 16 января 2024 г.
  57. ^ IEEE 754 2008 , §5.12.
  58. ^ IEEE 754 2008 , §5.12.2.
  59. ^ Гей, Дэвид М. (1990-11-30), Правильно округленные двоично-десятичные и десятично-двоичные преобразования , Рукопись численного анализа, Мерри Хилл, Нью-Джерси, США: AT&T Laboratories, 90-10
  60. ^ Паксон, Верн; Кахан, Уильям (22 мая 1991 г.), Программа для тестирования десятично-двоичного преобразования IEEE , рукопись, CiteSeerX   10.1.1.144.5889
  61. ^ IEEE 754 2008 , §5.12.3
  62. ^ «6.9.3. Шестнадцатеричные литералы с плавающей запятой — Glasgow Haskell Compiler 9.3.20220129 Руководство пользователя» . ghc.gitlab.haskell.org . Проверено 29 января 2022 г.

Стандарты

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

Вторичные ссылки

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

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: af06e32636a1043765cc24eb216196a2__1722395640
URL1:https://arc.ask3.ru/arc/aa/af/a2/af06e32636a1043765cc24eb216196a2.html
Заголовок, (Title) документа по адресу, URL1:
IEEE 754 - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)