Правила с плавающей запятой (Direct3D 10)
Direct3D 10 поддерживает несколько различных представлений с плавающей запятой. Все вычисления с плавающей запятой работают в определенном подмножестве 354-разрядной 32-разрядной точности с плавающей запятой.
- 32-разрядные правила Floating-Point
- 16-разрядные правила Floating-Point
- 11-разрядные и 10-разрядные правила Floating-Point
- связанные разделы
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-разрядные числа с плавающей запятой сохраняют денормы.
- Любая операция, которая приведет к нулю меньше нуля, зацепляется к нулю.
Связанные разделы