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


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

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

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

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

Правила IEEE-754

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

  • Деление на 0 производит +/-INF, за исключением 0/0, что приводит к naN.
  • Log of (+/-) 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, когда или оба операнда возвращаются FALSE.
  • Сравнения игнорируют знак 0 (поэтому +0 равен -0).
  • Сравнение NE, когда или оба операнда возвращаются TRUE.
  • Сравнение любого значения, отличного от NaN, с +/-INF, возвращает правильный результат.

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

  • IEEE-754 требует операций с плавающей запятой для получения результата, который является ближайшим представляемым значением к бесконечно точному результату, известному как округление до ближайшего. Однако Direct3D 10 определяет более свободное требование: 32-разрядные операции с плавающей запятой создают результат, который находится в пределах одного единицы последнего места (1 ULP) бесконечно точного результата. Это означает, что, например, оборудование может усечь результаты до 32-разрядной, а не выполнять округление до ближайшего, так как это приведет к ошибке не более одного ULP.
  • Нет поддержки исключений с плавающей запятой, битов состояния или ловушек.
  • Денормы очищаются до знака, сохраненного нулевой на входных и выходных данных любой математической операции с плавающей запятой. Исключения создаются для любой операции ввода-вывода или перемещения данных, которая не управляет данными.
  • Состояния, содержащие значения с плавающей запятой, такие как Viewport MinDepth/MaxDepth, BorderColor и т. д., могут быть предоставлены как значения денорма и могут не быть удалены перед использованием оборудования.
  • Минимальное или максимальное количество операций смыть денормы для сравнения, но результат может или не быть денормирован.
  • Входные данные NaN для операции всегда создают NaN на выходных данных, однако точный битовый шаблон NaN не требуется для того, чтобы оставаться неизменным (если операция не является необработанной инструкцией перемещения , которая не изменяет данные вообще.)
  • Минимальное или максимальное количество операций, для которых только один операнду является 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.
  • Спутанные операции (такие как безумные, dp3) дают результаты, которые не менее точны, чем худшее возможное последовательное упорядочивание оценки непроверенного расширения операции. Обратите внимание, что определение наихудшего возможного порядка в целях терпимости не является фиксированным определением для данной операции сплавленной операции; он зависит от конкретных значений входных данных. Отдельные шаги в неисправном расширении допускаются каждый 1 допускающий ULP (или для каких-либо инструкций Direct3D 10 вызывается с более неоплачиваемой терпимостью, чем 1 ULP, тем больше неоплачиваемой терпимости допускается).
  • Неисплавленные операции соответствуют тем же правилам NaN, что и неисплавленные операции.
  • Умножьте и разделите каждую операцию на 32-разрядном уровне точности с плавающей запятой (точность до 1 ULP).

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

Direct3D 10 также поддерживает 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-разрядными числами с плавающей запятой создают результат, который является ближайшим реплицируемым значением к бесконечно точному результату (округляется до ближайшего, на 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 — 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-разрядные числа с плавающей запятой сохраняют денормы.
  • Любая операция, которая приведет к нулю меньше нуля, зацепляется к нулю.

ресурсы (Direct3D 10)