Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Direct3D podporuje několik formátů s pohyblivou řádovou čárkou. Všechny výpočty s plovoucí řádovou čárkou se řídí definovanou podmnožinou pravidel IEEE 754 pro jednoduchou přesnost (32 bitů).
32-bitová pravidla s plovoucí desetinnou čárkou
Existují dvě sady pravidel: ty, které odpovídají standardu IEEE-754, a ty, které se odchylují od standardu.
dodržovaná norma 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 plus/mínus 0 vytváří -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á operace) jakákoli hodnota = NaN
Porovnání EQ, GT, GE, LT a LE, pokud jeden nebo oba operandy jsou NaN, vrátí FALSE.
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 a vyšší verze definují stejný požadavek jako IEEE-754: 32bitové operace s plovoucí desetinnou čárkou poskytují výsledek, který se nachází do 0,5 jednotky posledního místa (ULP) nekonečně přesného výsledku. To znamená, že například hardware je povolen zkrátit výsledky na 32 bitů místo zaokrouhlení na nejbližší sudé číslo, protože výsledkem by byla chyba maximálně 0,5 ULP. Toto pravidlo platí jenom pro sčítání, odčítání a násobení.
Dřívější verze Direct3D definují volnější požadavek než IEEE-754: 32bitové operace s plovoucí řádovou čárkou produkují výsledek, který je v rámci jednoho ULP (unit-last-place) od nekonečně přesného výsledku. To znamená, že například hardware může zkrátit výsledky na 32bitovou verzi, nikoli provést zaokrouhlené na nejbližší, protože výsledkem by byla chyba maximálně jedné funkce ULP.
Výjimky s plovoucí desetinnou čárkou, stavové bity 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í plovoucí hodnoty, například hodnoty viewport minDepth/maxDepth nebo borderColor, mohou být poskytnuty jako denorm hodnoty a mohou, ale nemusí být upravované před tím, než je hardware použije.
Operace min nebo max vyprázdní denormální čísla pro porovnání, ale výsledek může být nebo nemusí být denormálně 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.
Specifikace IEEE-754R pro operace min a max s plovoucí desetinnou čárkou uvádí, že pokud jeden ze vstupů do operace min nebo max je tichá QNaN hodnota, výsledkem operace je druhý parametr. Například:
min(x,QNaN) == min(QNaN,x) == x (same for max)Revize specifikace IEEE-754R přijala jiné chování pro minimální a maximální hodnotu, pokud je jedním vstupem hodnota SNaN "signaling" versus hodnota QNaN:
min(x,SNaN) == min(SNaN,x) == QNaN (same for max)Obecně platí, že Direct3D se řídí standardy aritmetik: IEEE-754 a IEEE-754R. Ale v tomto případě máme odchylku.
Aritmetická pravidla v Direct3D 10 a novějších nerozlišují mezi tichými a signalizačními hodnotami NaN (QNaN a SNaN). Všechny hodnoty NaN se zpracovávají stejným způsobem. V případě min a max je chování Direct3D pro libovolnou hodnotu NaN podobné tomu, jak se QNaN zpracovává v definici IEEE-754R. (Pro úplnost – pokud jsou oba vstupy NaN, vrátí se jakákoli hodnota NaN.)
Dalším pravidlem IEEE 754R je to, že min(-0;+0) == min(+0;-0) == -0 a max(-0;+0) == max(+0;-0) == +0, což respektuje znaménko, na rozdíl od pravidel porovnání pro nulu se znaménkem (jak jsme viděli dříve). Direct3D 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 vyprázdnění denormalizovaných hodnot). Ale -0 + 0 = +0.
Fúzované operace (například mad, dp3) poskytují výsledky, které nejsou méně přesné než výsledky v nejhorším možném seriovém uspořádání hodnocení nefú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ů. Každý jednotlivý krok v nespojeném rozšíření má povolenu 1 toleranci ULP (nebo pro jakékoli instrukce, které Direct3D vyvolává 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.
64bitová pravidla s plovoucí řádovou čárkou (dvojitá 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 je třeba pro údaje s dvojitou přesností (bez přepnutí na nulovou hodnotu). Podobně instrukce nečtou denormalizovaná data jako nulu se znaménkem, ale respektují hodnotu denormalizovaného čísla.
Pravidla pro čísla s 16bitovou plovoucí desetinnou čárkou
Direct3D podporuje také 16bitové reprezentace čísel s plovoucí desetinnou čá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 (podepsané nekonečno)
- 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 čárkou se také vztahují na 16bitová čísla, upravená podle rozložení bitů popsaného výše. Mezi výjimky patří:
- Přesnost: Nepropojené operace s 16bitovými čísly s plovoucí desetinnou čárkou vytvářejí výsledek, který je nejbližší reprezentovatelnou hodnotou k nekonečně přesnému výsledku (zaokrouhleno na nejbližší sudé číslo, podle normy IEEE-754, aplikováno 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 nezfúzované operace a 0,6 ULP pro fúzované operace.
- 16bitová čísla s pohyblivou desetinnou čárkou zachovávají denormální čísla.
11bitová a 10bitová pravidla s pohyblivou řádovou čárkou
Direct3D podporuje také 11bitové a 10bitové formáty s plovoucí desetinnou čá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.
související témata