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
- 16-bitowych reguł Floating-Point
- 11-bitowych i 10-bitowych reguł Floating-Point
- Tematy pokrewne
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.
Tematy pokrewne
-
zasoby (Direct3D 10)