Поделиться через


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

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

32-разрядные правила с плавающей запятой

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

Соблюдение правил IEEE-754

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

  • Деление на 0 производит +/-INF, за исключением 0/0, что приводит к naN.
  • Логарифм от (+/-) 0 создает -INF. логарифм отрицательного значения (кроме -0) вызывает NaN.
  • Обратный квадратный корень (rsq) или квадратный корень (sqrt) отрицательного числа производит NaN. Исключение равно -0; sqrt(-0) производит -0, а rsq(-0) производит -INF.
  • INF - INF = NaN
  • (+/-)INF / (+/-)INF = NaN
  • (+/-)INF * 0 = NaN
  • NaN (any OP) any-value = NaN
  • Сравнения EQ, GT, GE, LT и LE, если один или оба операнда NaN, возвращают FALSE.
  • Сравнения игнорируют знак 0 (поэтому +0 равен -0).
  • Сравнение NE возвращает TRUE, если один или оба операнда являются NaN.
  • Сравнение любого значения, отличного от NaN, с +/-INF, возвращает правильный результат.

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

  • IEEE-754 требует, чтобы операции с плавающей запятой давали результат, который является ближайшим представляемым значением к бесконечно точному результату, известному как округление до ближайшего четного. Direct3D 11 определяет то же требование: 32-разрядные операции с плавающей запятой создают результат, который находится в пределах 0,5 единицы последнего места (ULP) бесконечно точного результата. Это означает, что, например, оборудование может усечь результаты до 32 бит, а не выполнять округление до ближайшего чётного, так как это приведет к ошибке не более 0,5 ULP. Это правило применяется только к сложению, вычитанию и умножению.

  • Нет поддержки исключений с плавающей запятой, битов состояния или ловушек.

  • Денормы преобразуются в ноль, сохраняющий знак, на входе и выходе любой математической операции с плавающей точкой. Исключения создаются для любой операции ввода-вывода или перемещения данных, которая не управляет данными.

  • Состояния, содержащие значения с плавающей запятой, такие как Viewport MinDepth/MaxDepth, BorderColor, могут быть предоставлены в виде значений денорма и могут быть удалены до использования оборудования.

  • Минимальные или максимальные операции сбрасывают денормалы для сравнения, но результат может быть, а может и не быть денормализован.

  • NaN в качестве входных данных в операцию всегда приводит к NaN на выходе. Но точный битовый шаблон NaN не требуется для того, чтобы оставаться неизменным (если операция не является необработанной инструкцией перемещения , которая не изменяет данные.)

  • Операции min и max, для которых только один операнд является NaN, возвращают другой операнд в результате (вопреки правилам сравнения, которые мы рассмотрели ранее). Это правило IEEE 754R.

    Арифметические правила в Direct3D 10 и более поздних версиях не делают никаких различий между "тихими" и "сигнальными" значениями NaN (QNaN и SNaN). Все значения NaN обрабатываются одинаково.

  • Если оба входных данных в min() или max() являются NaN, возвращается любой naN.

  • Правило IEEE 754R состоит в том, что min(-0,+0) == min(+0,-0) == -0 и max(-0,+0) == max(+0,-0) == +0; что сохраняет знак. Это в отличие от правил сравнения для знакового нуля (указано выше). Direct3D 11 рекомендует поведение IEEE 754R здесь, но не применяет его; Допустимо, чтобы результат сравнения нулей зависел от порядка параметров, где сравнение игнорирует знаки.

  • x*1.0f всегда приводит к x (за исключением случаев, когда денормализованные числа подавлены).

  • x/1.0f всегда равно x (за исключением денормальных чисел, сброшенных до нуля).

  • x +/- 0.0f всегда приводит к x (за исключением денормализованного числа с очисткой). Но -0 + 0 = +0.

  • Объединённые операции (такие как mad, dp3) дают результаты, которые не менее точны, чем худшее возможное последовательное упорядочивание вычисления несоединённого варианта операции. Определение наихудшего возможного упорядочивания с точки зрения допустимых отклонений не является фиксированным для данной объединенной операции; оно зависит от конкретных значений входных данных. Отдельные шаги в расширении без слияния допускают отклонение до 1 ULP (или, если инструкции Direct3D допускают более либеральное отклонение, разрешено это более либеральное отклонение).

  • Сплавленные операции соответствуют тем же правилам NaN, что и неисплавленные операции.

  • sqrt и rcp имеют допуск в 1 ULP. Инструкции шейдера на взаимное значение и взаимный квадратный корень, rcp и rsq, имеют свои отдельные требования к расслабленной точности.

  • Умножение и деление выполняются на уровне точности с плавающей запятой в 32 разряда (точность до 0,5 ULP для умножения и 1,0 ULP для вычисления взаимной величины). Если x/y реализуется напрямую, результаты должны иметь большую или равную точность по сравнению с двухшаговым методом.

64-разрядные правила с плавающей запятой (двойная точность)

Аппаратные и дисплейные драйверы опционально поддерживают двойную точность с плавающей запятой. Чтобы указать поддержку, при вызове ID3D11Device::CheckFeatureSupport с D3D11_FEATURE_DOUBLESдрайвер устанавливает DoublePrecisionFloatShaderOps для D3D11_FEATURE_DATA_DOUBLES в значение TRUE. Затем драйвер и оборудование должны поддерживать все инструкции двойной точности с плавающей запятой.

Инструкции по двойной точности соответствуют требованиям к поведению IEEE 754R.

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

16-разрядные правила с плавающей запятой

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

Формат:

  • 1 бит знака (s)в позиции бита MSB
  • 5 бит предвзятой экспоненты (e)
  • 10 бит дроби (f), с дополнительным скрытым битом

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

  • если e == 31 и f != 0, то v — NaN независимо от s
  • если e == 31 и f == 0, то v = (-1)s*бесконечность (подписанная бесконечность)
  • Если e находится в пределах от 0 до 31, то v = (-1)s*2^(e-15)*(1.f)
  • if 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-разрядные правила с плавающей запятой

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

Формат:

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

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

  • если e == 31 и f != 0, то v — NaN
  • если 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-разрядные числа с плавающей запятой сохраняют денормализованные значения.
  • Любая операция, результат которой - число меньше нуля, приравнивается к нулю.

ресурсы

текстуры