Числовое соответствие

В этой главе описываются, как Металлический язык штриховки представляет числа с плавающей точкой относительно точности в математических операциях. Металл совместим с подмножеством стандарта IEEE 754.

INF, NaN и денормализованные числа

INF (положительное или отрицательное бесконечное значение), должен поддерживаться для чисел одинарной точности с плавающей точкой и дополнительные для полуточности числа с плавающей точкой.

NaN (не число) должны поддерживаться для чисел одинарной точности с плавающей точкой (с быстрой отключенной математикой) и дополнительные для полуточности числа с плавающей точкой. Если быстрая математика включена, поведение обработки NaN (как вводы или выводы) не определено.

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

Округление режима

В зависимости от возможностей оборудования или раунд к нулю или режим округления раунда-к-самому-близкому могут поддерживаться для одинарной точности и полуточности операции с плавающей точкой.

Исключения с плавающей точкой

Исключения с плавающей точкой отключены в Металле.

Относительная погрешность как ULPs

Таблица 7-1 описывает минимальную точность одинарной точности основные арифметические операции с плавающей точкой и математические функции, данные как ULP (модуль наименьшего количества точности или модуль в последнем месте) значения. Ссылочное значение, используемое для вычислений значения ULP арифметической операции, является бесконечно точным результатом. В таблице термин ulps используется как стенография для модулей наименьшего количества точности.

Табличная 7-1  точность минимума операций с плавающей точкой и функций

Математическая функция

Минимальная Точность (значения 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 указан как параметр компилятора).

Табличная 7-2  точность минимума операций и функций с быстрой включенной математикой

Математическая функция

Минимальная Точность (значения 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 за исключением случаев, описанных в третьем столбце.

Табличные 7-3  правила для преобразования от нормализованного целого числа до нормализованного значения с плавающей точкой

Преобразуйте из

Правило преобразования к нормализованному плаванию

Угловые случаи

8-разрядное нормализованное целое без знака

float(c) / 255.0

0 должен преобразовать в 0,0.

255 должен преобразовать в 1,0.

10-разрядное нормализованное целое без знака

float(c) / 1023.0

0 должен преобразовать в 0,0.

1023 должен преобразовать в 1,0.

16-разрядное нормализованное целое без знака

float(c) / 65535.0

0 должен преобразовать в 0,0.

65535 должен преобразовать в 1,0.

8-разрядное нормализованное целое число со знаком

max(-1.0, float(c)/127.0)

- 128 и-127 должен преобразовать в-1.0.

0 должен преобразовать в 0,0.

127 должен преобразовать в 1,0.

16-разрядное нормализованное целое число со знаком

max(-1.0, float(c)/32767.0)

- 32768 и-32767 должен преобразовать в-1.0.

0 должен преобразовать в 0,0.

32767 должен преобразовать в 1,0.

Преобразование из значений с плавающей точкой

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

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

Предпочтительные методы выполнить преобразования от значений с плавающей точкой до нормализованных целочисленных значений перечислены в Таблице 7-4.

Табличные 7-4  правила для преобразования от с плавающей точкой до нормализованного целочисленного значения

Преобразуйте в

Правило преобразования к нормализованному целому числу

8-разрядное нормализованное целое без знака

x = convert_float_uchar_saturate(f * 255.0f)

10-разрядное нормализованное целое без знака

x = convert_float_ushort_saturate(f * 1023.0f)

(x тогда преобразовывается в 10-разрядное целое без знака),

16-разрядное нормализованное целое без знака

x = convert_float_ushort_saturate(f * 65535.0f)

8-разрядное нормализованное целое число со знаком

x = convert_float_char_saturate(f * 255.0f)

16-разрядное нормализованное целое число со знаком

x = convert_float_short_saturate(f * 65535.0f)

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.

Табличные 7-5  правила для преобразования между целочисленными типами пиксельных данных

Преобразуйте из

Преобразуйте в

Правило преобразования

32-разрядное целое число со знаком

8-разрядное целое число со знаком

result = convert_char_saturate(val)

32-разрядное целое число со знаком

16-разрядное целое число со знаком

result = convert_short_saturate(val)

32-разрядное целое без знака

8-разрядное целое без знака

result = convert_uchar_saturate(val)

32-разрядное целое без знака

16-разрядное целое без знака

result = convert_ushort_saturate(val)

Правила преобразования для 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