Sdílet prostřednictvím


Pravidla s plovoucí desetinou čárkou (Direct3D 10)

Direct3D 10 podporuje několik různých reprezentací s plovoucí desetinou čárkou. Všechny výpočty s plovoucí desetinnou čárkou pracují s definovanou podmnožinou IEEE 754 32bitového chování s plovoucí desetinnou čárkou.

32bitová pravidla Floating-Point

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.

  • Vydělí se 0 výsledkem +/- INF, s výjimkou 0/0, což vede k nan.
  • log of (+/-) 0 vytvoří -INF. Log of a negative value (other than -0) vytváří NaN.
  • Reciproční druhá odmocnina (rsq) nebo druhá odmocnina (sqrt) záporného čísla vznikne 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, pokud jeden nebo oba operandy je NaN vrátí FALSE.
  • Porovnání ignorují znaménko 0 (takže +0 se rovná -0).
  • Porovnání NE, pokud jeden nebo oba operandy je 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ého přesného výsledku, označovaného jako sudé zaokrouhlené na nejbližší. Direct3D 10 však definuje volný požadavek: 32bitové operace s plovoucí desetinou čárkou vytvářejí výsledek, který je v rámci jednoho jednotky posledního místa (1 ULP) nekonečného 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í desetinou čárkou, bity stavu nebo soutisky nejsou podporovány.
  • Denormy se vyprázdní tak, aby se při vstupu zachovala nula a výstup jakékoli matematické operace s plovoucí desetinou čárkou. Výjimky jsou provedeny pro všechny vstupně-výstupní operace nebo operace přesunu dat, které s daty manipulují.
  • Stavy, které obsahují hodnoty s plovoucí desetinou čárkou, například Viewport MinDepth/MaxDepth, Hodnoty BorderColor atd., mohou být poskytnuty jako hodnoty denorm a mohou nebo nemusí být před použitím hardwarem vyprázdněné.
  • 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 vytváří naN ve výstupu, ale přesný bitový vzor NaN není nutný k tomu, aby zůstal stejný (pokud operace není nezpracovaná instrukce pro přesunutí – což vůbec 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 výše uvedených pravidel porovnání). Toto je nové pravidlo IEEE (IEEE 754R), které se vyžaduje v Direct3D 10.
  • Dalším novým pravidlem IEEE 754R je to, že min(-0;+0) == min(+0;-0) == -0 a max(-0;+0) == max(+0;-0) == +0, které dodržují znaménko, na rozdíl od pravidel porovnání pro nulu se znaménkem (uvedeno výše). Direct3D 10 zde doporučuje chování IEEE 754R, ale nebude vynuceno; 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 denorm vyprazdněných).
  • x/1,0f vždy vede k x (s výjimkou denorm vyprázdnění).
  • x +/- 0,0f vždy vede k x (s výjimkou denorm vyprázdnění). Ale -0 + 0 = +0.
  • Tavené operace (například šílené, dp3) produkují výsledky, které nejsou méně přesné než nejhorší možné sériové řazení vyhodnocení nefúzované rozšíření operace. Všimněte si, že definice nejhoršího možného řazení pro účely tolerance není pevnou definicí pro danou sloučenou operaci; závisí na konkrétních hodnotách vstupů. Jednotlivé kroky v neplněném rozšíření jsou každá povolená 1 tolerance ULP (nebo pro jakékoli instrukce Direct3D 10 volá s více laxní tolerance než 1 ULP, je povolena více laxní tolerance).
  • Sloučené operace dodržují stejná pravidla NaN jako neplněné operace.
  • Vynásobte a rozdělte jednotlivé operace na 32bitové úrovni přesnosti s plovoucí desetinnou čárkou (přesnost na 1 ULP).

16bitová pravidla Floating-Point

Direct3D 10 podporuje také 16bitové reprezentace čísel s plovoucí desetinou čá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í následujícími 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 (nekonečno se sign.)
  • 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)

32bitová pravidla s plovoucí desetinou čárkou také obsahují 16bitová čísla s plovoucí desetinou čárkou upravená pro rozložení bitů popsané výše. Mezi výjimky patří:

  • Přesnost: Nespouštěné operace s 16bitovými čísly s plovoucí desetinnou čárkou vytvářejí výsledek, který je nejbližší reprezentovatelnou hodnotou na nekonečně přesný výsledek (zaokrouhlený na nejbližší sudý IEEE-754, použitý na 16bitové hodnoty). 32bitová pravidla s plovoucí desetinnou čárkou dodržují 1 odolnost proti úniku informací, 16bitová pravidla s plovoucí desetinnou čárkou dodržují pravidla 0,5 ULP pro neplněné operace a 0,6 ULP pro sloučené operace.
  • 16bitová čísla s plovoucí desetinou čárkou zachovávají denormy.

11bitová a 10bitová pravidla Floating-Point

Direct3D 10 podporuje také 11bitové a 10bitové formáty s plovoucí deseti čá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)

32bitová pravidla s plovoucí desetinou čárkou také obsahují 11bitová a 10bitová čísla s plovoucí desetinutovou čárkou upravená pro rozložení bitů popsané výše. Mezi výjimky patří:

  • Přesnost: 32bitová pravidla s plovoucí desetinnou čárkou dodržují pravidla 0,5 ULP.
  • 10/11bitová čísla s plovoucí desetinou čárkou zachovávají denormy.
  • Jakákoli operace, která by byla výsledkem čísla menšího než nula, je uchycená na nulu.

zdroje (Direct3D 10)