Direct3D 10 では、いくつかの異なる浮動小数点表現がサポートされています。 すべての浮動小数点計算は、IEEE 754 32 ビット単精度浮動小数点動作の定義済みのサブセットで動作します。
32 ビット Floating-Point ルール
規則には、IEEE-754 に準拠するものと標準から逸脱した規則の 2 つのセットがあります。
優先される IEEE-754 規則
これらの規則の一部は、IEEE-754 が選択肢を提供する 1 つのオプションです。
- 0 で除算すると +/- INF が生成されます。ただし、0/0 を除くと NaN になります。
- (+/-) 0 のログでは-INF が生成されます。 負の値の対数 (-0以外) は NaN を生成します。
- 負の数の逆平方根 (rsq) または平方根 (sqrt) は NaN を生成します。 例外は -0 です。sqrt(-0) は -0 を生成し、rsq(-0) は -INF を生成します。
- INF - INF = NaN
- (+/-)INF / (+/-)INF = NaN
- (+/-)INF * 0 = NaN
- NaN (任意の OP) any-value = NaN
- 一方または両方のオペランドが NaN の場合、EQ、GT、GE、LT、LE の比較では、FALSE 返されます。
- 比較では、0 の符号は無視されます (したがって、+0 は -0と等しくなります)。
- 一方または両方のオペランドが NaN の場合、比較 NE は TRUE 返します。
- NaN 以外の値を +/- INF と比較すると、正しい結果が返されます。
IEEE-754 規則からの逸脱または追加要件
- IEEE-754 では、無限に正確な結果に最も近い表現可能な値である結果を生成するために浮動小数点演算が必要です。これは、最も近い偶数への丸めと呼ばれます。 ただし、Direct3D 10 では、より緩い要件が定義されています。32 ビット浮動小数点演算では、無限に正確な結果の 1 つの単位の最終位置 (1 ULP) 内にある結果が生成されます。 つまり、たとえば、ハードウェアでは、最大 1 つの ULP のエラーが発生するため、最も近い偶数へのラウンドを実行するのではなく、結果を 32 ビットに切り捨てることが許可されます。
- 浮動小数点例外、状態ビット、またはトラップはサポートされません。
- 非正規化は、浮動小数点演算の入力と出力で符号保持ゼロにフラッシュされます。 データを操作しない I/O 操作またはデータ移動操作に対して例外が行われます。
- ビューポート MinDepth/MaxDepth、BorderColor 値などの浮動小数点値を含む状態は、非正規化値として提供される場合があり、ハードウェアで使用する前にフラッシュされる場合と、フラッシュされない場合があります。
- 最小または最大の操作は比較のために非正規化をフラッシュしますが、結果がフラッシュされていない場合とフラッシュされない場合があります。
- 操作に対する NaN 入力では常に出力時に NaN が生成されますが、NaN の正確なビット パターンは同じままである必要はありません (操作が生の移動命令である場合を除き、データはまったく変更されません)。
- 1 つのオペランドのみが NaN である最小または最大の演算は、結果としてもう一方のオペランドを返します (上記の比較規則とは異なり)。 これは、Direct3D 10 で必要な新しい IEEE 規則 (IEEE 754R) です。
- もう 1 つの新しい IEEE 754R 規則は、符号付きゼロ (上記) の比較規則とは対照的に、min(-0,+0) == min(+0,-0) == -0、および max(-0,+0) == max(+0,-0) == +0 という点です。 Direct3D 10 では、ここでは IEEE 754R の動作を推奨していますが、適用されません。ゼロを比較した結果は、符号を無視する比較を使用して、パラメーターの順序に依存することが許容されます。
- x*1.0f は常に x になります (非正規化フラッシュを除く)。
- x/1.0f は常に x になります (非正規化フラッシュを除く)。
- x +/- 0.0f は常に x になります (非正規化フラッシュを除く)。 ただし、-0 + 0 = +0 です。
- 融合演算 (mad、dp3 など) は、操作の融合されていない拡張の評価の可能な限り最悪のシリアル順序よりも正確ではない結果を生成します。 許容を目的とした最悪の順序付けの定義は、特定の融合演算の固定された定義ではないことに注意してください。入力の特定の値に依存します。 融合されていない拡張の個々のステップは、それぞれ許容される 1 ULP 許容度です (または、Direct3D 10 が 1 ULP より緩い許容範囲で呼び出す命令の場合は、より緩い許容度が許可されます)。
- 融合された操作は、非融合操作と同じ NaN ルールに従います。
- 乗算と除算は、32 ビット浮動小数点精度レベル (精度 1 ULP) で動作します。
16 ビット Floating-Point ルール
Direct3D 10 では、浮動小数点数の 16 ビット表現もサポートされています。
形式:
- MSB ビット位置の 1 符号ビット
- 5 ビットのバイアス指数 (e)
- 10 ビットの分数 (f)、追加の隠しビット
float16 値 (v) は、次の規則に従います。
- e == 31 および f != 0 の場合、v は s に関係なく NaN になります
- e == 31 および f == 0 の場合、v = (-1)s*infinity (符号付き無限大)
- e が 0 ~ 31 の場合、v = (-1)s*2(e-15)*(1.f)
- e == 0 および f != 0 の場合、v = (-1)s*2(e-14)*(0.f) (非正規化された数値)
- e == 0 および f == 0 の場合、v = (-1)s*0 (符号付きゼロ)
32 ビット浮動小数点ルールは、前述のビット レイアウトに合わせて調整された 16 ビット浮動小数点数にも保持されます。 これに対する例外は次のとおりです。
- 精度: 16 ビット浮動小数点数に対する非融合演算では、無限に正確な結果に最も近い表現可能な値である結果が生成されます (IEEE-754 ごとに最も近い偶数に丸め、16 ビット値に適用されます)。 32 ビット浮動小数点ルールは 1 ULP 許容値に準拠し、16 ビット浮動小数点ルールは、融合されていない操作の場合は 0.5 ULP、融合操作の場合は 0.6 ULP に準拠します。
- 16 ビット浮動小数点数は非正規化を保持します。
11 ビットおよび 10 ビットの Floating-Point 規則
Direct3D 10 では、11 ビットおよび 10 ビットの浮動小数点形式もサポートされています。
形式:
- 符号ビットなし
- 5 ビットのバイアス指数 (e)
- 11 ビット形式の場合は 6 ビットの分数 (f)、10 ビット形式の場合は 5 ビットの分数 (f)、どちらの場合も追加の隠しビット。
float11/float10 値 (v) は、次の規則に従います。
- e == 31 および f != 0 の場合、v は NaN です
- e == 31 および f == 0 の場合、v = +無限大
- e が 0 から 31 の場合、v = 2(e-15)*(1.f)
- e == 0 および f != 0 の場合、v = *2(e-14)*(0.f) (非正規化された数値)
- e == 0 および f == 0 の場合、v = 0 (ゼロ)
また、32 ビット浮動小数点ルールは、前述のビット レイアウトに合わせて調整された 11 ビットおよび 10 ビットの浮動小数点数にも保持されます。 例外は次のとおりです。
- 精度: 32 ビット浮動小数点規則は、0.5 ULP に準拠します。
- 10/11 ビット浮動小数点数は非正規化を保持します。
- 0 未満の数値になる演算は、0 にクランプされます。
関連トピック