浮動小数点精度のコンテキストでは、.NET は浮動小数点精度を提供していないとして批判されています。決定論とは、同一の入力を持つコードがマシン間で異なる結果を生成する可能性があるためです。この問題を軽減するために、開発者は固定小数点演算を使用することにしましたが、この解決策は面倒です。
興味深い提案の 1 つは、すべての浮動小数点値を単精度または倍精度に明示的にキャストすることで決定性を達成することです。 (float) や (double) などのキャストを使用します。このメソッドは、明示的なキャストによって conv.r4 または conv.r8 命令の挿入が強制され、精度が制限される可能性があると述べている MSDN 記事によってサポートされています。
しかし、さらなる主張では、明示的なキャストは単に「ヒント」を提供するだけかもしれないと主張しています。 」をランタイムに送信し、決定性を確保するためにコンパイラーと CLR が協力する必要があることを示唆しています。この問題を明確にするために、次の質問を詳しく調べてみましょう:
1. Float への明示的なキャストによる IL:
への conv.r4 の挿入 C# 仕様では明示的にこれを要求していませんが、コンパイラーは、Float への明示的なキャストでは常に conv.r4 オペコードを挿入することを保証します。この動作は、コンパイラのテスト ケースの単体テストによって確認されています。
2. conv.r4 命令はネイティブ サイズに切り捨てられます:
はい、CLR 仕様のパーティション I、セクション 12.1.3 に記載されているように、conv.r4 命令は浮動小数点値をネイティブ サイズに切り捨てます。
追加の考慮事項:
以上が明示的なキャストと conv 命令は、.NET で浮動小数点の決定性をどのように保証できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。