浮動小数点比較の不一致
提供されたコード スニペットでは、
int main() { float a = 0.7; float b = 0.5; if (a < 0.7) { if (b < 0.5) printf("2 are right"); else printf("1 is right"); } else printf("0 are right"); }
「0」の期待される出力は次のとおりです。正しい」が得られません。代わりに、「1 が正しい」と表示されます。この不一致は、浮動小数点数に固有の不精度が原因で発生します。
浮動小数点オペランドとの比較を実行すると、浮動小数点オペランドは自動的に倍精度値に昇格されます。浮動小数点数は倍精度浮動小数点より精度が低いため、意図した値を正確に表現できない場合があります。この場合、a (float) が 0.7 (double) と比較されると、a は内部で double に変換され、精度が失われます。この結果、a は 0.7 よりわずかに小さくなり、a
この問題を解決するには、次のいずれかを実行できます:
double a = 0.7; double b = 0.5;
float a = 0.7f; float b = 0.5f;
どちらのアプローチでも、オペランドが浮動小数点数として維持され、double への昇格時の精度の低下が回避されます。
以上が浮動小数点の比較で予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。