Udostępnij za pośrednictwem


Reguły zmiennoprzecinkowe (Direct3D 10)

Funkcja Direct3D 10 obsługuje kilka różnych reprezentacji zmiennoprzecinkowych. Wszystkie obliczenia zmiennoprzecinkowe działają w ramach zdefiniowanego podzestawu zachowania zmiennoprzecinkowego IEEE 754 32-bitowej precyzji.

32-bitowe reguły Floating-Point

Istnieją dwa zestawy reguł: te zgodne ze standardem IEEE-754 i te, które odbiegają od standardu.

Honorowane reguły IEEE-754

Niektóre z tych reguł są jedną opcją, w której ieee-754 oferuje opcje wyboru.

  • Podziel przez 0 daje +/- INF, z wyjątkiem 0/0, co powoduje nan.
  • wartość dziennika (+/-) generuje wartość -INF. dziennik wartości ujemnej (innej niż -0) generuje wartość NaN.
  • Pierwiastek kwadratowy (rsq) lub pierwiastek kwadratowy (sqrt) liczby ujemnej generuje Wartość NaN. Wyjątek to -0; sqrt(-0) generuje -0, a rsq(-0) generuje -INF.
  • INF — INF = NaN
  • (+/-)INF / (+/-)INF = NaN
  • (+/-)INF * 0 = NaN
  • NaN (dowolna wartość op) = NaN
  • Porównania EQ, GT, GE, LT i LE, gdy oba operandy są zwracane FALSE.
  • Porównania ignorują znak 0 (więc +0 równa się -0).
  • Porównanie wartości NE, gdy oba operandy to NaN zwraca wartość true.
  • Porównania dowolnej wartości innej niż NaN względem +/- INF zwracają prawidłowy wynik.

Odchylenia lub dodatkowe wymagania dotyczące reguł IEEE-754

  • IEEE-754 wymaga operacji zmiennoprzecinkowych, aby wygenerować wynik, który jest najbliższą wartością godną reprezentowania do nieskończenie precyzyjnego wyniku, znanego jako zaokrąglony do najbliższego. Direct3D 10 definiuje jednak luźniejsze wymaganie: 32-bitowe operacje zmiennoprzecinkowe generują wynik, który znajduje się w jednym miejscu ostatniej jednostki (1 ULP) nieskończonie precyzyjnego wyniku. Oznacza to, że na przykład sprzęt może obcinać wyniki do 32-bitowego, a nie wykonywać zaokrąglenia do najbliższego nawet, co spowodowałoby błąd co najwyżej jednego ULP.
  • Nie ma obsługi wyjątków zmiennoprzecinkowych, bitów stanu lub pułapek.
  • Denorms są opróżniane do znaku zachowane zero w danych wejściowych i wyjściowych dowolnej operacji matematycznej zmiennoprzecinkowej. Wyjątki są tworzone dla operacji we/wy lub przenoszenia danych, które nie manipulują danymi.
  • Stany zawierające wartości zmiennoprzecinkowe, takie jak Viewport MinDepth/MaxDepth, BorderColor wartości itp., mogą być udostępniane jako wartości denorm i mogą być opróżniane przed użyciem sprzętu.
  • Minimalna lub maksymalna liczba operacji opróżniania normów w porównaniu, ale wynik może lub nie może być opróżniony.
  • Dane wejściowe NaN do operacji zawsze generuje wartość NaN w danych wyjściowych, jednak dokładny wzorzec bitowy nazwy NaN nie jest wymagany do zachowania tej samej wartości (chyba że operacja jest instrukcją nieprzetworzonego przenoszenia — która w ogóle nie zmienia danych).
  • Minimalna lub maksymalna liczba operacji, dla których tylko jeden operand to NaN, zwraca drugi operand w wyniku (w przeciwieństwie do powyższych reguł porównania). Jest to nowa reguła IEEE (IEEE 754R), wymagana w trybie Direct3D 10.
  • Kolejną nową regułą IEEE 754R jest to, że min(-0,+0) == (+0,-0) == -0 i max(-0,+0) == max(+0,-0) == +0, który honoruje znak, w przeciwieństwie do reguł porównania dla podpisanego zera (określone powyżej). Direct3D 10 zaleca zachowanie IEEE 754R tutaj, ale nie zostanie wymuszone; dopuszczalne jest, aby wynik porównywania zer był zależny od kolejności parametrów, przy użyciu porównania, które ignoruje znaki.
  • x*1.0f zawsze powoduje wartość x (z wyjątkiem opróżniania norm).
  • x/1.0f zawsze powoduje wynik x (z wyjątkiem opróżnienia denorm).
  • x +/- 0.0f zawsze powoduje wartość x (z wyjątkiem opróżnienia denorm). Ale -0 + 0 = +0.
  • Operacje połączone (takie jak mad, dp3) generują wyniki, które nie są mniej dokładne niż najgorsze możliwe szeregowe porządkowanie oceny niezmiernego rozszerzania operacji. Należy pamiętać, że definicja najgorszej możliwej kolejności, w celu tolerancji, nie jest stałą definicją dla danej operacji połączonej; zależy od określonych wartości danych wejściowych. Poszczególne kroki w niezmaganym rozszerzaniu są dozwolone 1 tolerancji ULP (lub instrukcje Direct3D 10 wywołuje bardziej łagodną tolerancję niż 1 ULP, tym bardziej łagodna tolerancja jest dozwolona).
  • Operacje połączone są zgodne z tymi samymi regułami NaN co operacje niezwiązane.
  • Pomnóż i podziel każdą operację na 32-bitowym poziomie dokładności zmiennoprzecinkowej (dokładność do 1 ULP).

16-bitowe reguły Floating-Point

Direct3D 10 obsługuje również 16-bitowe reprezentacje liczb zmiennoprzecinkowych.

Format:

  • 1 bit znaku (s)w pozycji bitowej MSB
  • 5 bitów wykładnika stronniczego (e)
  • 10 bitów ułamka (f) z dodatkowym ukrytym bitem

Wartość float16 (v) jest zgodna z następującymi regułami:

  • jeśli e == 31 i f != 0, to v jest naN niezależnie od s
  • if e == 31 and f == 0, then v = (-1)s*infinity (podpisana nieskończoność)
  • jeśli wartość e wynosi od 0 do 31, v = (-1)s*2(e-15)*(1.f)
  • jeśli e == 0 i f != 0, to v = (-1)s*2(e-14)*(0.f) (zdenormalizowane liczby)
  • jeśli e == 0 i f == 0, to v = (-1)s*0 (ze znakiem zero)

32-bitowe reguły zmiennoprzecinkowe zawierają również 16-bitowe liczby zmiennoprzecinkowe dostosowane do układu bitowego opisanego powyżej. Wyjątki od tego obejmują:

  • Precyzja: Operacje bezfusowe na 16-bitowych liczbach zmiennoprzecinkowych generują wynik, który jest najbliższą wartością reprezentującą nieskończonie precyzyjny wynik (zaokrąglony do najbliższego parzystego, na IEEE-754, zastosowany do wartości 16-bitowych). 32-bitowe reguły zmiennoprzecinkowe są zgodne z 1 tolerancją ULP, 16-bitowe reguły zmiennoprzecinkowe są zgodne z 0,5 ULP w przypadku operacji niezrozumionych i 0,6 ULP dla operacji bezpieczonych.
  • 16-bitowe liczby zmiennoprzecinkowe zachowują denormy.

11-bitowe i 10-bitowe reguły Floating-Point

Direct3D 10 obsługuje również formaty zmiennoprzecinkowe 11-bitowe i 10-bitowe.

Format:

  • Brak bitu znaku
  • 5 bitów wykładnika stronniczego (e)
  • 6 bitów ułamka (f) dla formatu 11-bitowego, 5 bitów ułamka (f) dla formatu 10-bitowego, z dodatkowym ukrytym bitem w obu przypadkach.

Wartość float11/float10 (v) jest zgodna z następującymi regułami:

  • jeśli e == 31 i f != 0, v jest naN
  • if e == 31 and f == 0, then v = +infinity
  • jeśli wartość e wynosi od 0 do 31, v = 2(e-15)*(1.f)
  • if e == 0 and f != 0, then v = *2(e-14)*(0.f) (denormalizowane liczby)
  • jeśli e == 0 i f == 0, to v = 0 (zero)

32-bitowe reguły zmiennoprzecinkowe zawierają również 11-bitowe i 10-bitowe liczby zmiennoprzecinkowe dostosowane do układu bitowego opisanego powyżej. Wyjątki obejmują:

  • Precyzja: 32-bitowe reguły zmiennoprzecinkowe są zgodne z 0,5 ULP.
  • 10/11-bitowe liczby zmiennoprzecinkowe zachowują normy.
  • Każda operacja, która spowoduje, że liczba jest mniejsza niż zero, jest zaciśnięta do zera.

zasoby (Direct3D 10)