Share via


浮動小数点の規則

Direct3D 10 では、さまざまな浮動小数点表現がサポートされています。すべての浮動小数点計算は、IEEE 754 で規定されている 32 ビット単精度浮動小数点の動作に従って処理されます。

  • 32 ビット浮動小数点の規則
  • 16 ビット浮動小数点の規則
  • 11 ビットおよび 10 ビット浮動小数点の規則

32 ビット浮動小数点の規則

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 ULP (unit-last-place) 以内の結果が返されます。たとえば、ハードウェアでは、最も近い偶数への丸めを実行せず、結果を 32 ビットで切り捨てることができます。これは、切り捨てた場合にも、誤差が 1 ULP 以内となるためです。
  • 浮動小数点の例外、ステータス ビットまたはトラップはサポートされていません。
  • 非正規化数は、任意の浮動小数点算術演算の入力および出力において、符号付きのゼロにフラッシュされます。データを操作しない I/O 処理やデータ移動処理には例外が発生します。
  • Viewport MinDepth/MaxDepth、BorderColor 値などの浮動小数点値を含んだステートは、非正規化数の値として提供され、ハードウェアでの使用前にフラッシュされる場合と、フラッシュされない場合があります。
  • min または max 演算により、非正規化数が比較のためにフラッシュされますが、その結果は、フラッシュされた非正規化数となる場合とならない場合があります。
  • 演算への NaN の入力は常に NaN が出力され、同じ値を維持するために NaN の厳密なビット パターンは必要ありません (その演算が、データを一切変更しない、未変更のデータの移動命令ではない場合)。
  • 一方のオペランドのみが NaN である min または max 演算では、もう一方のオペランドが結果として返されます (前述の比較規則とは異なります)。これは、Direct3D 10 で要求される新しい IEEE 規則 (IEEE 754R) です。
  • 別の新たな 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 ビット浮動小数点の規則

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 ビット浮動小数点の規則

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 にクランプされます。

関連項目

リソース (Direct3D 10)