Sdílet prostřednictvím


Pravidla pro plovoucí řádovou čárku (Direct3D 11)

Direct3D 11 podporuje několik reprezentací plovoucí čárky. Všechny výpočty s plovoucí desetinnou čárkou fungují pod definovanou podmnožinou pravidel IEEE 754 32bitové jednoduché přesnosti s plovoucí desetinnou čárkou.

32bitová pravidla s plovoucí desetinnou čárkou

Existují dvě sady pravidel: ty, které odpovídají standardu IEEE-754, a ty, které se odchylují od standardu.

Ctěná pravidla IEEE-754

Některá z těchto pravidel jsou jedinou možností, kdy IEEE-754 nabízí volby.

  • Dělení nulou vede k +/- INF, s výjimkou 0/0, což vede k NaN.
  • Logaritmus z (+/-) 0 vede k -INF. Logaritmus záporné hodnoty (jiné než -0) produkuje NaN.
  • Reciproční druhá odmocnina (rsq) nebo druhá odmocnina (sqrt) záporného čísla vygeneruje NaN. Výjimka je -0; sqrt(-0) produkuje -0 a rsq(-0) vytváří -INF.
  • INF - INF = NaN
  • (+/-)INF / (+/-)INF = NaN
  • (+/-)INF * 0 = NaN
  • NaN (libovolný OP) any-value = NaN
  • Porovnání EQ, GT, GE, LT a LE vrátí FALSE, pokud jsou jeden nebo oba operandy NaN.
  • Porovnání ignorují znaménko 0 (takže +0 se rovná -0).
  • Porovnání NE, pokud jeden z operandů nebo oba operandy jsou NaN, vrátí TRUE.
  • Porovnání jakékoli hodnoty jiné než NaN s hodnotou +/- INF vrátí správný výsledek.

Odchylky nebo další požadavky z pravidel IEEE-754

  • IEEE-754 vyžaduje, aby operace s plovoucí desetinnou čárkou vytvořily výsledek, který je nejbližší reprezentovatelnou hodnotou nekonečně přesného výsledku, označovaného jako zaokrouhlení na nejbližší sudé. Direct3D 11 definuje stejný požadavek: 32bitové operace s plovoucí řádovou čárkou produkují výsledek, který se nachází v rozmezí 0,5 ULP (jednotky posledního místa) od nekonečně přesného výsledku. To znamená, že například hardware může zkrátit výsledky na 32 bitů, místo aby prováděl zaokrouhlení na nejbližší sudé číslo, protože by to vedlo k největší chybě 0,5 ULP. Toto pravidlo platí pouze pro sčítání, odčítání a násobení.

  • Výjimky s plovoucí desetinnou čárkou, bity stavu nebo pasti nejsou podporovány.

  • Denormalizovaná čísla jsou při vstupu a výstupu jakékoli matematické operace s plovoucí řádovou čárkou převedena na nulu se zachováním znaménka. Výjimky jsou činěny pro jakoukoli vstupně-výstupní operaci nebo operaci přesunu dat, která s daty nemanipuluje.

  • Stavy, které obsahují hodnoty s pohyblivou řádovou čárkou, například MinDepth/MaxDepth z Viewportu a hodnoty BorderColor, mohou být poskytnuty jako hodnoty denorm a mohou nebo nemusí být vyčištěny před tím, než je hardware použije.

  • Minimální nebo maximální počet operací vyprázdnění pro porovnání, ale výsledek může nebo nemusí být denormně vyprázdněný.

  • Vstup NaN do operace vždy vytvoří naN ve výstupu. Přesný bitový vzor NaN se ale nevyžaduje, aby zůstal stejný (pokud operace není instrukcí pro přímý přesun – což nemění data).

  • Minimální nebo maximální operace, pro které je pouze jeden operand naN, vrátí druhý operand jako výsledek (na rozdíl od srovnávacích pravidel, na které jsme se podívali dříve). Toto je pravidlo IEEE 754R.

    Aritmetická pravidla v Direct3D 10 a novějších neznají žádné rozdíly mezi hodnotami "quiet" a "signaling" NaN (QNaN vs SNaN). Všechny hodnoty NaN se zpracovávají stejným způsobem.

  • Pokud jsou oba vstupy do min() nebo max() naN, vrátí se jakákoli hodnota NaN.

  • Pravidlo IEEE 754R je to, že min(-0;+0) == min(+0;-0) == -0 a max(-0;+0) == max(+0;-0) == +0; které uctívá znamení. To je na rozdíl od srovnávacích pravidel pro zápornou nulu (uvedeno výše). Direct3D 11 zde doporučuje chování IEEE 754R, ale nevynucuje ho; je přípustné, aby výsledek porovnání nul byl závislý na pořadí parametrů pomocí porovnání, které ignoruje znaménka.

  • x*1,0f vždy vede k x (s výjimkou případů, kdy jsou denormální čísla odstraněna).

  • x/1.0f vždy vede k x (s výjimkou, když jsou denormalizované hodnoty vymazány).

  • x +/- 0,0f vždy vede k x (s výjimkou vyřazení denormalizovaných hodnot). Ale -0 + 0 = +0.

  • Sloučené operace (například mad, dp3) produkují výsledky, které nejsou méně přesné než nejhorší možné sériové uspořádání vyhodnocení nezfúzovaného rozšíření operace. Definice nejhoršího možného řazení pro účely tolerance není pevnou definicí dané operace; závisí na konkrétních hodnotách vstupů. Jednotlivé kroky v nesloučené expanzi mají povolenou toleranci 1 ULP (nebo pro jakékoli instrukce, které Direct3D označí s více laxní tolerancí než 1 ULP, je povolena více laxní tolerance).

  • Sloučené operace dodržují stejná pravidla NaN jako nesloučené operace.

  • sqrt a rcp mají toleranci 1 ULP. Shader reciproční a reciproční odmocninové instrukce, rcp a rsq, mají vlastní samostatný uvolněný požadavek přesnosti.

  • Vynásobte a rozdělte jednotlivé operace na 32bitové úrovni přesnosti s plovoucí desetinnou čárkou (přesnost na 0,5 ULP pro násobení, 1,0 ULP pro reciproční). Pokud je x/y implementováno přímo, výsledky musí mít větší nebo stejnou přesnost než dvoustupňová metoda.

Pravidla pro aritmetiku s plovoucí desetinnou čárkou s 64-bitovou (dvojitou přesností)

Hardwarové a zobrazovací ovladače volitelně podporují dvojitou přesnost plovoucí desetinné čárky. Chcete-li označit podporu, při volání ID3D11Device::CheckFeatureSupport s D3D11_FEATURE_DOUBLES, ovladač nastaví DoublePrecisionFloatShaderOpsD3D11_FEATURE_DATA_DOUBLES na TRUE. Ovladač a hardware pak musí podporovat všechny instrukce s plovoucí desetinnou čárkou s dvojitou přesností.

Pokyny pro dvojitou přesnost odpovídají požadavkům na chování IEEE 754R.

Podpora generování denormalizovaných hodnot se vyžaduje pro dvojitou přesnost (bez zpracování nulových hodnot). Podobně instrukce nečtou denormalizovaná data jako nulu se znaménkem, ale respektují jejich denormalizovanou hodnotu.

16bitová pravidla pro čísla s plovoucí desetinnou čárkou

Direct3D 11 také podporuje 16bitové reprezentace čísel s plovoucí řádovou čárkou.

Formát:

  • 1 znaménko (s) v pozici bitu MSB
  • 5 bitů zkresleného exponentu (e)
  • 10 bitů zlomku (f) s dalším skrytým bitem

Hodnota float16 (v) se řídí těmito pravidly:

  • pokud e == 31 a f != 0, pak v je NaN bez ohledu na s
  • pokud e == 31 a f == 0, pak v = (-1)s*nekonečno (s podepsaným nekonečnem)
  • je-li e v rozmezí 0 až 31, pak v = (-1)s*2(e-15)*(1.f)
  • pokud e == 0 a f != 0, pak v = (-1)s*2(e-14)*(0.f) (denormalizovaná čísla)
  • pokud e == 0 a f == 0, pak v = (-1)s*0 (podepsaná nula)

Pravidla pro 32bitová čísla s plovoucí desetinnou tečkou platí také pro 16bitová čísla, upravená pro rozložení bitů popsané výše. Mezi výjimky patří:

  • Přesnost: Neintegrované operace s 16bitovými čísly s plovoucí desetinnou čárkou vytvářejí výsledek, který je nejbližší reprezentovatelnou hodnotou s nekonečnou přesností (zaokrouhlení na nejbližší sudou hodnotu podle IEEE-754, aplikované na 16bitové hodnoty). 32bitová pravidla s plovoucí desetinnou čárkou dodržují toleranci 1 ULP, 16bitová pravidla s plovoucí desetinnou čárkou dodržují toleranci 0,5 ULP pro neplněné operace a 0,6 ULP pro sloučené operace.
  • 16bitová čísla s plovoucí desetinnou čárkou zachovávají denormy.

11-bitová a 10-bitová pravidla s plovoucí desetinnou čárkou

Direct3D 11 také podporuje 11bitové i 10bitové formáty s plovoucí čárkou.

Formát:

  • Bez znaménka
  • 5 bitů zkresleného exponentu (e)
  • 6 bitů zlomku (f) pro 11bitový formát, 5 bitů zlomku (f) pro 10bitový formát s dalším skrytým bitem v obou případech.

Hodnota float11/float10 (v) se řídí následujícími pravidly:

  • pokud e == 31 a f != 0, pak v je NaN
  • pokud e == 31 a f == 0, pak v = +nekonečno
  • je-li e mezi 0 a 31, pak v = 2(e-15)*(1.f)
  • pokud e == 0 a f != 0, pak v = *2(e-14)*(0.f) (denormalizovaná čísla)
  • pokud e == 0 a f == 0, pak v = 0 (nula)

Pravidla pro 32bitová čísla s plovoucí řádovou čárkou platí také pro 11bitová a 10bitová čísla, s úpravou pro rozložení bitů popsané výše. Mezi výjimky patří:

  • Přesnost: 32bitová čísla s plovoucí desetinnou čárkou se řídí hodnotou 0,5 ULP.
  • 10/11bitová čísla s plovoucí desetinnou čárkou zachovávají denormalizovaná čísla.
  • Jakákoli operace, která by vedla k číslu menšímu než nula, se nastaví na nulu.

prostředků

textury