6

最近NaN、SSE算術演算の値についてこれを読みました。

数値ではない2つの(NAN)引数に作用する算術演算の結果は未定義です。したがって、NAN引数を使用した浮動小数点演算は、対応するアセンブリ命令の予想される動作と一致しません。

ソース: http: //msdn.microsoft.com/en-us/library/x5c07e2a (v = vs.100).aspx

これは、たとえば、2つの値を追加すると、が実数に__m128変換される可能性があることを意味しますか?NaN

計算が値に依存しているNaN場合は、最終結果NaNも同様である必要があります。これを行う方法はありますか?

4

1 に答える 1

5

そのテキストを解釈すると、コンパイラはSSE命令にほぼ対応するさまざまな組み込み関数を提供しているということです。一般に、コンパイラーはSSE命令を使用して組み込み関数を実装することが期待できます。ただし、これは厳密ではありません。組み込み関数は、実際には、計算の抽象的なモデルで操作を指定します。SSE命令を直接指定することはありません。その抽象モデルでは、2つのNaN(1つのNaNと1つの数値を許可していないように見える)を操作した結果は定義されていません。したがって、たとえば2つのNaNを追加した結果は、NaNではない可能性があります。

特に、抽象モデルでの操作はコンパイラーの最適化の対象となり、それらの最適化によりSSE命令以外のものが生じる可能性があります(コンパイル時の計算、コンパイラーがNaNが存在すると推測できる場合は命令が省略されるため、実際には必要ありません)追加などを実行します)。

SSE命令に指定されたセマンティクスを保証したい場合は、Microsoftのコンパイラで組み込み関数を使用するのではなく、アセンブリ言語で記述しなければならない可能性があります。

ベンダーが浮動小数点セマンティクスに短い節約を与えるのをやめたいと思います。明確に指定された動作がない場合、エンジニアリングを行うことは困難です。

于 2013-03-22T00:31:22.990 に答える