c#フローティングポイント算術:精度と比較落とし穴
C#のフローティングポイント算術は、便利ですが、その有限表現のために固有の不正確さに苦しんでいます。 これは、一見等しい値を比較するときに予期しない結果につながる可能性があります。 この例を考えてみましょう:
出力は直感に反します。 なぜ? C#の32ビットフロートの精度は限られているためです(約23の有意ビット)。
<code class="language-csharp">class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); // Outputs "false" } }</code>
と0.09f
は近くに表示されますが、丸い浮遊点表現はわずかに異なり、比較f1
f2
。f1 > f2
。
false
これは、重大な制限を強調しています。浮動小数点数の直接的な平等または不平等の比較は信頼できません。 人間の観察に気付いていない微小な違いは、比較を引き起こす可能性があります。
この関数は、2つのフロート間の絶対的な差が事前定義された
未満であるかどうかをチェックします。 適切な
を選択することは、コンテキストと予想される精度のレベルに依存します。 より高い精度を得るには、<code class="language-csharp">bool AreApproximatelyEqual(float a, float b, float tolerance) { return Math.Abs(a - b) < tolerance; }</code>
を使用することを検討してください。 ただし、より正確ではあるものの、tolerance
でも同様の制限があります。tolerance
以上がC#のフローティングポイント算術は、一見等しい値を比較するときに予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。