.NET での浮動小数点決定論の確保
浮動小数点決定論の重要性にもかかわらず、.NET にはそれを強制するための明示的なオプションがありません。しかし、最近の議論では、明示的なキャストを通じて浮動小数点値を強制的にネイティブの精度に戻すという潜在的な解決策が提案されています。
決定メカニズムとしての明示的なキャスト
によるとCLR エンジニアの David Notario 氏、明示的なキャストは conv.r4 のような絞り込み命令の挿入をトリガーし、効果的に値を強制的に切り捨てる必要があると述べています。ネイティブサイズに合わせます。これは、すべての式と部分式を float にキャストすると決定的な結果が保証されることを示唆しています。
ランタイムの "ヒント"
ただし、Eric Lippert の声明は、次のようなニュアンスをほのめかしています。鋳造プロセス。同氏は、明示的なキャストが行われた場合、C# コンパイラがランタイムに「ヒント」を提供すると主張しています。同氏は、このヒントはランタイムに高精度モードの計算を終了するよう指示するものだと示唆しています。
コンパイラと CLR の仕様
調べてみると、C# 仕様では明示的には規定されていません。明示的なキャストにより conv.r4 の挿入が強制されることに言及します。ただし、コンパイラの単体テストではこの動作が確認されています。一方、CLR 仕様では、conv.r4 が値をネイティブ サイズに切り捨てると明確に述べています。
切り捨ての保証
明示的なキャストは切り捨てを保証しますが、実際には、複数のマシン間で再現可能な結果を保証するものではありません。 FPU/SSE 設定などの他の要因が浮動小数点演算の動作に影響を与える可能性があります。 CLR 仕様のセクション 12.1.3 では、非正規化と NaN の影響について説明しています。
代替アプローチ
明示的なキャストに加えて、配列 (double[]) への値の割り当てまたは float[])、静的フィールドまたはインスタンス フィールドに対しても、浮動小数点値は切り捨てられます。ただし、真に再現可能な演算を行うには、整数を推奨します。
以上が明示的なキャストによって .NET で浮動小数点の決定性をどのように確保できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。