Правила с плавающей запятой (Direct3D 10)

Direct3D 10 поддерживает несколько различных представлений с плавающей запятой. Все вычисления с плавающей запятой выполняются в рамках определенного подмножества 32-разрядной модели IEEE 754 с плавающей запятой с плавающей запятой.

32-разрядные правила Floating-Point

Существует два набора правил: тех, что соответствуют стандарту IEEE-754, и тех, что отклоняются от него.

Почетные правила IEEE-754

Некоторые из этих правил безальтернативны, если стандарт IEEE-754 предоставляет несколько вариантов.

  • При делении на ноль получается положительное или отрицательное бесконечное число, за исключением деления нуля на ноль, в результате которого получается не число.
  • Результатом логарифма положительного или отрицательного нуля является отрицательное бесконечное число. Результатом логарифма отрицательного значения (отличного от отрицательного нуля) является не число.
  • Результатом извлечения обратного квадратного корня (rsq) или квадратного корня (sqrt) из отрицательного числа является не число. Исключение — отрицательный ноль; результатом sqrt(-0) является -0, а результатом rsq(-0) — отрицательное бесконечное число.
  • Разностью двух бесконечных чисел является не число.
  • Отношением между положительным или отрицательным бесконечным числом и вторым таким же числом является не число.
  • (+/-) INF * 0 = NaN
  • Результатом любой операции между не числом и любым значением является не число.
  • Сравнения EQ, GT, GE, LT и LE, в которых один или оба операнда являются не числами, возвращают FALSE.
  • В сравнениях знак нуля игнорируется (то есть положительный ноль равен отрицательному).
  • Сравнение NE, в котором один или оба операнда являются не числами, возвращает TRUE.
  • Сравнение любого значения, не являющегося не числом, с положительным или отрицательным бесконечным числом возвращает верный результат.

Отклонения или дополнительные требования от правил IEEE-754

  • По условиям стандарта IEEE-754, результатом операций с плавающей точкой должно быть представляемое значение, ближайшее к бесконечно точному результату, известное как округление к ближайшему четному числу. Однако Direct3D 10 определяет более слабое требование: 32-разрядные операции с плавающей запятой дают результат, который находится в пределах одной единицы последнего места (1 ULP) от бесконечно точного результата. Это означает, что, например, оборудованию позволено усекать результаты до 32-разрядного формата, вместо того чтобы округлять их к ближайшему четному числу, так как это привело бы к ошибке в пределах одной ULP.
  • Исключения, биты состояния и ловушки с плавающей точкой не поддерживаются.
  • Денормализованные числа приводятся к нулю с сохранением знака при вводе и выводе любой математической операции с плавающей точкой. Исключения создаются для любых операций ввода-вывода или перемещения данных, которые не обрабатывают данные.
  • Состояния, содержащие значения с плавающей запятой, такие как Viewport MinDepth/MaxDepth, значения BorderColor и т. д., могут быть предоставлены в качестве значений денормирования и могут быть удалены или не очищаться перед использованием оборудования.
  • Операции минимизации или максимизации сбрасывают денормализованные числа для сравнения, но результат в виде денормализованного числа может не быть сброшен.
  • Входные данные NaN для операции всегда создают NaN на выходных данных, однако точный битовый шаблон NaN не требуется, чтобы оставаться неизменным (если операция не является необработанной инструкцией перемещения, которая вообще не изменяет данные).
  • Операции min или max, для которых только один операнд является NaN, возвращают другой операнд в качестве результата (вопреки приведенным выше правилам сравнения). Это новое правило IEEE (IEEE 754R), обязательное для Direct3D 10.
  • Еще одно новое правило IEEE 754R заключается в том, что min(-0,+0) == min(+0,-0) == -0, и max(-0,+0) == max(+0,-0) == +0, которые учитывают знак, в отличие от правил сравнения для нулевого знака (указано выше). Direct3D 10 рекомендует здесь поведение IEEE 754R, но оно не будет применяться; Допустимо, чтобы результат сравнения нулей зависел от порядка параметров с использованием сравнения, которое игнорирует знаки.
  • X*1.0f всегда приводит к x (за исключением денорма).
  • x/1,0f всегда выдает x (за исключением сброса к денормализованному числу).
  • x +/ -0,0f всегда выдает x (за исключением сброса к денормализованному числу). Но -0 + 0 = +0.
  • Совмещенные операции (например, mad, dp3) выдают не менее точные результаты, чем худшее возможное последовательное упорядочение вычисления несовмещенного расширения операции. Обратите внимание, что определение наихудшего возможного порядка в целях допуска не является фиксированным определением для данной операции с слиянием; это зависит от конкретных значений входных данных. Для отдельных шагов в неразрывном расширении каждый допускается 1 допуск ULP (или для любых инструкций Direct3D 10 вызывает с более нестрогой допуск, чем 1 ULP, тем более нестрогое отклонение допускается).
  • Совмещенные операции следуют тем же правилам относительно не чисел, что и несовмещенные операции.
  • Умножение и деление каждой операции выполняются на 32-разрядном уровне точности с плавающей запятой (точность до 1 ULP).

16-разрядные правила Floating-Point

Direct3D 10 также поддерживает 16-разрядные представления чисел с плавающей запятой.

Формат:

  • 1 бит знака (s) в положении старшего разряда;
  • 5 битов смещенного порядка (e);
  • 10 дробных битов (f) с дополнительным скрытым битом.

Значение float16 (v) соответствует следующим правилам:

  • если e == 31 и f != 0, то v — не число независимо от s;
  • если e == 31 и f == 0, то v = (-1)s*infinity (бесконечность со знаком)
  • Если значение e находится в диапазоне от 0 до 31, то v = (-1)s*2(e-15)*(1.f)
  • если e == 0 и f != 0, то v = (-1)s*2(e-14)*(0.f) (денормализованные числа)
  • если e == 0 и f == 0, то v = (-1)s*0 (ноль со знаком)

32-разрядные правила с плавающей запятой также хранятся для 16-разрядных чисел с плавающей запятой с учетом описанного выше битового макета. Но есть следующие исключения:

  • Точность. Несовмещенные операции над 16-разрядными числами с плавающей точкой выдают результат в виде представляемого значения, ближайшего к бесконечно точному результату (согласно IEEE-754, округление к ближайшему четному числу применяется к 16-разрядным значениям). 32-разрядные правила с плавающей точкой придерживаются допуска в 1 ULP, 16-разрядные правила с плавающей точкой придерживаются допуска в 0,5 ULP для несовмещенных операций и 0,6 ULP для совмещенных операций.
  • 16-разрядные числа с плавающей тачкой сохраняют денормализованные значения.

11- и 10-разрядные правила Floating-Point

Direct3D 10 также поддерживает 11-разрядные и 10-разрядные форматы с плавающей запятой.

Формат:

  • бит знака отсутствует;
  • 5 битов смещенного порядка (e);
  • 6 дробных битов (f) в 11-разрядном формате, 5 дробных битов (f) в 10-разрядном формате с дополнительным скрытом битом в обоих случаях.

Значение float11/float10 (v) соответствует следующим правилам:

  • если e == 31 и f != 0, то v — не число;
  • если e == 31 и f == 0, то v = положительная бесконечность
  • Если значение e находится в диапазоне от 0 до 31, то v = 2(e-15)*(1.f)
  • если e == 0 и f != 0, то v = *2(e-14)*(0.f) (денормализованные числа)
  • если e == 0 и f == 0, то v = 0 (ноль)

32-разрядные правила с плавающей запятой также содержат 11-разрядные и 10-разрядные числа с плавающей запятой с учетом описанного выше битового макета. Исключения:

  • Точность. 32-разрядные правила с плавающей точкой придерживаются допуска в 0,5 ULP.
  • 10/11-разрядные числа с плавающей тачкой сохраняют денормализованные значения.
  • Любая операция, которая приведет к числу меньше нуля, зажимается до нуля.

Ресурсы (Direct3D 10)