浮動小数点ルール (Direct3D 10)
Direct3D 10 では、いくつかの異なる浮動小数点表現がサポートされています。 すべての浮動小数点計算は、IEEE 754 32 ビット単精度浮動小数点動作の定義されたサブセットで動作します。
32 ビット Floating-Point ルール
規則には、IEEE-754 に準拠する規則、および IEEE-754 と異なる規則の 2 種類があります。
優先 IEEE-754 規則
これらの規則のいくつかは、IEEE-754 が複数の選択肢を提供している中の 1 つの選択肢の場合があります。
- 0 での除算は +/- INF になります。ただし、0/0 の結果は NaN になります。
- (+/-) 0 の対数 (log) は -INF になります。 負の値 (-0 以外) の対数 (log) は NaN になります。
- 負の値の逆数平方根 (rsq) または平方根 (sqrt) は、NaN になります。 -0 は例外です。sqrt(-0) は -0 になり、rsq(-0) は -INF になります。
- INF - INF = NaN
- (+/-)INF / (+/-)INF = NaN
- (+/-)INF * 0 = NaN
- NaN (任意の演算子) 任意の値 = NaN
- 比較演算の EQ、GT、GE、LT、および LE は、一方または両方のオペランドが NaN であるとき、FALSE を返します。
- 比較演算では 0 の符号は無視されます (したがって +0 は -0 と等しくなります)。
- 比較演算の NE は、一方または両方のオペランドが NaN であるとき、TRUE を返します。
- NaN ではない任意の値を +/- INF と比較すると、正しい結果が返されます。
IEEE-754 規則からの逸脱または追加要件
- IEEE-754 では、浮動小数点演算において、無限大精度の結果に最も近い、表現可能な値を求めることが要求されており、これは最も近い偶数への丸めと呼ばれます。 ただし、Direct3D 10 では、より緩やかな要件が定義されています。32 ビット浮動小数点演算では、無限に正確な結果の 1 つの単位最終位置 (1 ULP) 内にある結果が生成されます。 たとえば、ハードウェアでは、最も近い偶数への丸めを実行せず、結果を 32 ビットで切り捨てることができます。これは、切り捨てた場合にも、誤差が 1 ULP 以内となるためです。
- 浮動小数点の例外、ステータス ビットまたはトラップはサポートされていません。
- 非正規化数は、任意の浮動小数点算術演算の入力および出力において、符号付きの 0 にフラッシュされます。 データを操作しない I/O 操作またはデータ移動操作に対して例外が行われます。
- ビューポート MinDepth/MaxDepth、BorderColor 値などの浮動小数点値を含む状態は、非正規化値として提供される場合があり、ハードウェアで使用する前にフラッシュされる場合と、フラッシュされない場合があります。
- min または max 演算により、非正規化数が比較のためにフラッシュされますが、その結果は、フラッシュされた非正規化数となる場合とならない場合があります。
- 操作に対する 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 つの符号ビット (s)
- 5 ビットのバイアス付き指数部 (e)
- 追加の隠しビットを持つ 10 ビットの小数部 (f)
float16 値 (v) は、次の規則に従います。
- e == 31 かつ f != 0 の場合、v は s にかかわらず NaN
- e == 31 かつ f == 0 の場合、v = (-1)s*無限大 (符号付き無限大)
- 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 ビット浮動小数点値に対する非組み合わせ演算では、無限大精度の結果に最も近い表現可能な値が結果として返されます (16 ビット値に適用された IEEE-754 に従う最も近い偶数への丸め)。 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 にクランプされます。
関連トピック