Числовое соответствие
В этой главе описываются, как Металлический язык штриховки представляет числа с плавающей точкой относительно точности в математических операциях. Металл совместим с подмножеством стандарта IEEE 754.
INF, NaN и денормализованные числа
INF
(положительное или отрицательное бесконечное значение), должен поддерживаться для чисел одинарной точности с плавающей точкой и дополнительные для полуточности числа с плавающей точкой.
NaN (не число) должны поддерживаться для чисел одинарной точности с плавающей точкой (с быстрой отключенной математикой) и дополнительные для полуточности числа с плавающей точкой. Если быстрая математика включена, поведение обработки NaN (как вводы или выводы) не определено.
Денормализованный сингл - или полуточность числа с плавающей точкой передали как ввод или произвели как вывод сингла - или полуточность, которую операции с плавающей точкой могут быть сброшены для обнуления.
Округление режима
В зависимости от возможностей оборудования или раунд к нулю или режим округления раунда-к-самому-близкому могут поддерживаться для одинарной точности и полуточности операции с плавающей точкой.
Исключения с плавающей точкой
Исключения с плавающей точкой отключены в Металле.
Относительная погрешность как ULPs
Таблица 7-1 описывает минимальную точность одинарной точности основные арифметические операции с плавающей точкой и математические функции, данные как ULP (модуль наименьшего количества точности или модуль в последнем месте) значения. Ссылочное значение, используемое для вычислений значения ULP арифметической операции, является бесконечно точным результатом. В таблице термин ulps используется как стенография для модулей наименьшего количества точности.
Математическая функция | Минимальная Точность (значения ULP) |
---|---|
x + y | Правильно округленный |
x - y | Правильно округленный |
x * y | Правильно округленный |
1.0/x | <= 2.5 ulps для одинарной точности |
x/y | <= 2.5 ulps для одинарной точности |
acos (x) | <= 4 ulps |
acosh (x) | <= 4 ulps |
asin (x) | <= 4 ulps |
asinh (x) | <= 4 ulps |
atan (x) | <= 5 ulps |
atan2 (y, x) | <= 6 ulps |
atanh (x) | <= 5 ulps |
перекройте (x) | Правильно округленный |
copysign (x) | 0 ulp |
because(x) | <= 4 ulps |
дубинка (x) | <= 4 ulps |
exp (x) | <= 4 ulps |
exp2 (x) | <= 4 ulps |
exp10 (x) | <= 4 ulps |
fabs (x) | 0 ulp |
fdim (x, y) | Правильно округленный |
пол (x) | Правильно округленный |
fma (x, y, z) | Правильно округленный (см. примечание ниже таблицы), |
fmax (x, y) | 0 ulp |
fmin (x, y) | 0 ulp |
fmod (x, y) | 0 ulp |
fract (x) | Правильно округленный |
frexp (x, y) | 0 ulp |
ilogb (x) | 0 ulp |
ldexp (x, y) | Правильно округленный |
журнал (x) | <= 4 ulps |
log2 (x) | <= 4 ulps |
log10 (x) | <= 4 ulps |
modf (x, i) | 0 ulp |
голова (x, y) | <= 16 ulps |
powr (x, y) | <= 16 ulps |
rint (x) | Правильно округленный |
раунд (x) | Правильно округленный |
rsqrt (x) | <= 2 ulps |
грех (x) | <= 4 ulps |
sincos (x, c) | <= 4 ulps |
sinh (x) | <= 4 ulps |
sqrt (x) | <= 3 ulps для одинарной точности |
загар (x) | <= 6 ulps |
tanh (x) | <= 5 ulps |
trunc (x) | Правильно округленный |
Таблица 7-2 описывает минимальную точность одинарной точности арифметические операции с плавающей точкой, данные как значения ULP с быстрой включенной математикой (который является значением по умолчанию если -fno-fast-math
указан как параметр компилятора).
Математическая функция | Минимальная Точность (значения ULP) |
---|---|
x + y | Правильно округленный |
x - y | Правильно округленный |
x * y | Правильно округленный |
1.0/x | <= 2.5 ulps для x в домене 2-126 к 2 126 |
x/y | <= 2.5 ulps для x в домене 2-126 к 2 126 |
acos (x) | <= 5 ulps |
acosh (x) | Реализованный как журнал (x + sqrt (x * x – 1.0)) |
asin (x) | <= 5 ulps для |x |> = 2-125 |
asinh (x) | Реализованный как журнал (x + sqrt (x * x + 1.0)) |
atan (x) | <= 5 ulps |
atanh (x) | Реализованный как 0,5 * (журнал (1.0 + x) / журнал (1.0 – x)) |
atan2 (y, x) | Реализованный как atan (y / x) |
because(x) | Для x в домене [-пи, пи], максимальная абсолютная погрешность <= 2-13. Вне того домена ошибка больше. |
дубинка (x) | Реализованный как 0,5 * (exp (x) + exp (-x)) |
exp (x) | <= 3 + пол (fabs (2 * x)) ulps |
exp2 (x) | <= 3 + пол (fabs (2 * x)) ulps |
exp10 (x) | Реализованный как exp2 (x * log2 (10)) |
fma (x, y, z) | Реализованный или как правильно округленный fma или как умножение и добавление, оба из которых правильно округлены. |
журнал (x) | Для x в домене [0.5, 2], максимальная абсолютная погрешность <= 2-21; иначе максимальная погрешность является <= 3 ulps |
log2 (x) | Для x в домене [0.5, 2], максимальная абсолютная погрешность <= 2-21; иначе максимальная погрешность является <= 3 ulps |
log10 (x) | Реализованный как log2 (x) * log10 (2) |
голова (x, y) | Реализованный как exp2 (y * log2 (x)) |
powr (x, y) | Реализованный как exp2 (y * log2 (x)) |
раунд (x) | Возвращает значение, равное самому близкому целому числу к x. Часть 0.5 округлена в направлении, выбранном реализацией. |
грех (x) | Для x в домене [-пи, пи], максимальная абсолютная погрешность <= 2-13. Вне того домена ошибка больше. |
sinh (x) | Реализованный как 0,5 * (exp (x) – exp (-x)) |
sincos (x) | ulp оценивает, как определено за грех (x) и because(x) |
sqrt (x) | Реализованный как 1,0 / rsqrt (x) |
загар (x) | Реализованный как грех (x) * (1.0 / because(x)) |
tanh (x) | Реализованный как (t – 1.0) / (t + 1.0), где t = exp (2.0 * x) |
Граничное поведение случая в сбросе для обнуления режима
Если denormals сбрасываются для обнуления, то функция может возвратить один из этих двух результатов:
Любой результат приспосабливания для не сбрасывает для обнуления режима. Если результатом является поднормаль перед округлением, он может быть сброшен для обнуления.
Если один или больше ее субнормальных операндов сбрасываются для обнуления, любой несбросил приспосабливающий результату для функции. Если результатом является поднормаль перед округлением, он может быть сброшен для обнуления.
В каждом из случаев, если операнд или результат сбрасываются для обнуления, знак нуля не определен.
Обращение текстуры и правила преобразования
Координаты текстуры, указанные к sample
, sample_compare
, gather
, gather_compare
, read
, и write
функции не могут быть INF или NaN. Кроме того, координата текстуры должна относиться к области в текстуре для текстуры read
и write
функции.
Следующие разделы обсуждают правила преобразования, применяющиеся при чтении и записи текстур в функции ядра или графике.
Правила преобразования для нормализованных целочисленных типов пиксельных данных
В этом разделе рассматриваются нормализованные целочисленные типы пиксельных данных преобразования к значениям с плавающей точкой и наоборот.
Преобразование в значения с плавающей точкой
Для текстур, имеющих 8-разрядные, 10-разрядные или 16-разрядные нормализованные пиксельные значения целого без знака, выборку текстуры и читающих функции, преобразовывают пиксельные значения от 8-разрядного или 16-разрядного целого без знака до нормализованного сингла - или полуточность значение с плавающей точкой в диапазоне [0.0, 1.0].
Для текстур, имеющих 8-разрядные или 16-разрядные нормализованные пиксельные значения целого числа со знаком, выборку текстуры и читающих функции, преобразовывают пиксельные значения от 8-разрядного или 16-разрядного целого числа со знаком до нормализованного сингла - или полуточность значение с плавающей точкой в диапазоне [-1.0, 1.0].
Эти преобразования выполняются, как перечислено во втором столбце Таблицы 7-3. Точность правил преобразования, как гарантируют, будет <= 1.5 ulps за исключением случаев, описанных в третьем столбце.
Преобразуйте из | Правило преобразования к нормализованному плаванию | Угловые случаи |
---|---|---|
8-разрядное нормализованное целое без знака |
| 0 должен преобразовать в 0,0. 255 должен преобразовать в 1,0. |
10-разрядное нормализованное целое без знака |
| 0 должен преобразовать в 0,0. 1023 должен преобразовать в 1,0. |
16-разрядное нормализованное целое без знака |
| 0 должен преобразовать в 0,0. 65535 должен преобразовать в 1,0. |
8-разрядное нормализованное целое число со знаком |
| - 128 и-127 должен преобразовать в-1.0. 0 должен преобразовать в 0,0. 127 должен преобразовать в 1,0. |
16-разрядное нормализованное целое число со знаком |
| - 32768 и-32767 должен преобразовать в-1.0. 0 должен преобразовать в 0,0. 32767 должен преобразовать в 1,0. |
Преобразование из значений с плавающей точкой
Для текстур, имеющих 8-разрядные, 10-разрядные или 16-разрядные нормализованные пиксельные значения целого без знака, функции записи текстуры преобразовывают сингл или полуточность пиксельное значение с плавающей точкой к 8-разрядному или 16-разрядному целому без знака.
Для текстур, имеющих 8-разрядные или 16-разрядные нормализованные пиксельные значения целого числа со знаком, функции записи текстуры преобразовывают сингл или полуточность пиксельное значение с плавающей точкой к 8-разрядному или 16-разрядному целому числу со знаком.
Предпочтительные методы выполнить преобразования от значений с плавающей точкой до нормализованных целочисленных значений перечислены в Таблице 7-4.
Преобразуйте в | Правило преобразования к нормализованному целому числу |
---|---|
8-разрядное нормализованное целое без знака |
|
10-разрядное нормализованное целое без знака |
(x тогда преобразовывается в 10-разрядное целое без знака), |
16-разрядное нормализованное целое без знака |
|
8-разрядное нормализованное целое число со знаком |
|
16-разрядное нормализованное целое число со знаком |
|
GPU может принять решение приблизить округляющийся режим, используемый в преобразованиях, описанных в Таблице 7-4. Если округляющийся режим кроме раунда к самому близкому даже используется, абсолютная погрешность зависящего от реализации режима округления по сравнению с бесконечно точным, ненормализованным результатом должна быть меньше чем или равна 0.6 ulps.
Правила преобразования для полуточности тип пиксельных данных с плавающей точкой
Для текстур, имеющих полуточность пиксельные значения цвета с плавающей точкой, преобразования из half
к float
без потерь. Преобразования из float
к half
вокруг мантиссы с помощью раунда для самого близкого даже или режима округления раунда к нулю. Денормализованные числа для half
тип данных, который может быть сгенерирован при преобразовании a float
к a half
может быть сброшен для обнуления. Плавание NaN
может быть преобразован в соответствующий NaN, или он может быть сброшен для обнуления в half
ввести. A float
INF может быть преобразован в надлежащий INF, или он может быть сброшен для обнуления в half
ввести.
Правила преобразования для типа данных канала с плавающей точкой
Соблюдающие правила запрашивают чтение и запись текстур, имеющих одинарную точность пиксельные значения цвета с плавающей точкой:
NaNs может быть преобразован в значение (я) NaN или сброшен для обнуления.
INFs может быть преобразован в значение (я) INF или сброшен для обнуления.
Denorms может быть сброшен для обнуления.
Все другие значения должны быть сохранены.
Правила преобразования для типов пиксельных данных целого числа со знаком и целого без знака
Для текстур, имеющих 8-разрядные или 16-разрядные пиксельные значения целого числа со знаком или целого без знака, выборку текстуры и читающих функции, возвращают 32-разрядное целочисленное пиксельное значение без знака или со знаком. Преобразования, описанные в этом разделе, должны правильно насыщаться.
Записи к этим целочисленным текстурам выполняют одно из преобразований, перечисленных в Таблице 7-5.
Преобразуйте из | Преобразуйте в | Правило преобразования |
---|---|---|
32-разрядное целое число со знаком | 8-разрядное целое число со знаком |
|
32-разрядное целое число со знаком | 16-разрядное целое число со знаком |
|
32-разрядное целое без знака | 8-разрядное целое без знака |
|
32-разрядное целое без знака | 16-разрядное целое без знака |
|
Правила преобразования для sRGBA и Текстур sBGRA
Преобразование от пространства sRGB до линейного пространства автоматически выполняется при выборке от текстуры sRGB. Преобразование от sRGB до линейного RGB выполняется, прежде чем фильтр указал в сэмплере, указанном, когда применяется выборка текстуры. Если текстура имеет альфа-канал, альфа-данные хранятся в линейном цветовом пространстве.
Преобразование от линейного до пространства sRGB автоматически выполняется при записи в текстуру sRGB. Если текстура имеет альфа-канал, альфа-данные хранятся в линейном цветовом пространстве.
Следующее является правилом преобразования для преобразования нормализованного 8-разрядного целого без знака sRGB, значение цвета к линейному значению цвета RGB с плавающей точкой (вызовите его c
) согласно правилам, описанным в Преобразовании нормализованных целочисленных пиксельных данных, вводит к значениям с плавающей точкой:
if (c <= 0.04045), |
result = c / 12.92; |
else |
result = powr((c + 0.055) / 1.055, 2.4); |
Получающееся значение с плавающей точкой, если преобразовано назад к значению sRGB, не округляясь к 8-разрядному значению целого без знака, должно быть в 0.5 ulps исходного значения sRGB.
Следующее является правилами преобразования для преобразования линейного RGB значение цвета с плавающей точкой (вызовите его c
) к нормализованному 8-разрядному целому без знака sRGB значение:
if (isnan(c)) c = 0.0; if (c > 1.0) c = 1.0; else if (c < 0.0) c = 0.0; else if (c < 0.0031308) c = 12.92 * c; else c = 1.055 * powr(c, 1.0/2.4) - 0.055; convert to integer scale i.e. c = c * 255.0 convert to integer: c = c + 0.5 drop the decimal fraction, and the remaining floating-point(integral) value is converted directly to an integer. |
Точность вышеупомянутого преобразования должна быть такова, что следующее является истиной:
fabs(reference result – integer result) <= 0.6 |