c#
での浮動小数点の不正確さを理解しますフローティングポイント算術の固有の不正確さは、しばしば予期しない結果につながります。 このC#コードスニペットを考えてみましょう:
class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); // Surprisingly prints "false" } }
出力「false」は直感に反しています。両方の計算が9.0を生成するように見えるためです。この矛盾は、浮動小数点表現の制限から生じます。
IEEE 754標準の浮動小数点数は、限られた数のビットを使用して分数部分を表します。 これは、多くの小数値を正確に保存できないことを意味します。それらは近似されています。 値0.09f
および計算の結果は近似です。 これらの近似は、しばしば取るに足らないものですが、予期しない比較を引き起こす可能性があります
したがって、
==
このアプローチでは、
Console.WriteLine(Math.Abs(f1 - f2) < 0.0001); // A more robust comparison
(二重精度の浮動小数点数)を使用すると、f1
(単一精度)よりも高い精度が得られ、これらの不正確さの可能性が減ります。 ただし、f2
値でさえも、エラーのマージンが少ないにもかかわらず、同様の制限の対象となります。 信頼できるフローティングポイント計算には、精密要件を慎重に検討することが不可欠です。
以上がC#のフローティングポイント計算が不正確なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。