x87 FPUは、内部80ビット精度モードを使用していることで注目に値します。これにより、コンパイラーやマシン間で予期しない再現不可能な結果が生じることがよくあります。.NETで再現可能な浮動小数点演算を検索したところ、.NETの両方の主要な実装(MicrosoftとMono)が64ビットモードでx87ではなくSSE命令を出力することがわかりました。
SSE(2)は、32ビットフロートには厳密に32ビットレジスタを使用し、64ビットフロートには厳密に64ビットレジスタを使用します。適切な制御ワードを設定することにより、オプションで非正規化数をゼロにフラッシュできます。
したがって、SSEはx87の精度関連の問題に悩まされておらず、唯一の変数は制御可能な非正規化動作であるように見えます。
超越関数(x87とは異なりSSEによってネイティブに提供されない)の問題は別として、SSEを使用すると、マシンとコンパイラ間で再現可能な結果が保証されますか?たとえば、コンパイラの最適化は異なる結果につながる可能性がありますか?私はいくつかの矛盾する意見を見つけました:
SSE2をお持ちの場合は、それを使用して、その後も幸せに暮らしてください。SSE2は32bと64bの両方の操作をサポートし、中間結果はオペランドのサイズになります。--Yossi Kreinin、http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html
..。
SSE2命令(...)はIEEE754-1985に完全に準拠しており、他のプラットフォームとの再現性(静的な丸め精度のおかげで)と移植性が向上します。Muller et aliis、 浮動小数点演算ハンドブック-p.107
でも:
また、浮動小数点にSSEまたはSSE2を使用することはできません。これは、指定が少なすぎて決定論的ではないためです。-John Watte http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411