検索

ホームページ  >  に質問  >  本文

c/c++ 比较两个浮点数相等

PHP中文网PHP中文网2767日前705

全員に返信(2)返信します

  • PHP中文网

    PHP中文网2017-04-17 15:10:48

    まず、2 つの if は同じです。浮動小数点数を整数と比較する場合、整数は浮動小数点数に変換されます。
    では、なぜ私は 10.0 に等しくないのでしょうか?これらの値とのみ等しいため:

    リーリー

    浮動小数点を 10 進数から 2 進数に変換する際にエラーがあることがわかります。エラーが 100 回累積すると、i は 9.99999999999998 に等しくなります。 (私は Python 3.6 を使用しています。浮動小数点数の 10 進表現は最も短い等価表現を使用します。また、C 言語と同じ内部表現を使用します。)

    コンピュータでは浮動小数点数はバイナリ形式で表現および演算されます (通常、IEEE 754 標準を使用します)。0.1 はバイナリでは正確に表現できません (循環小数です。分母に 2 の因数のみが含まれる小数のみが使用可能です)。バイナリで表現されます。それまで循環しません)。このようにエラーが発生します。誤差が蓄積すると、10 進法からどんどん逸脱していきます。

    等しいかどうかを比較する必要がある場合は、指定した数値との差を見つけることができます (Python の math.isclose 関数など) 差が特定の値より小さい場合、等しいと見なされます。

    正確な値が必要な場合 (1 ペニーも少ない財務計算を行う場合など)、いわゆる「10 進数」を使用して演算を実行できます (10 進数、Python と Ruby の両方でサポートされています。 mpDecimal ライブラリも使用します)、精度を指定するか (mpfr ライブラリを使用するなど)、固定小数点数を使用します。

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:10:48

    强数据类型 の言語については、double float のように小数点を含むデータを比較する場合、一般的に == は比較に使用されません。

    代わりに、2 つの数値の減算の絶対値を比較します。絶対値が小さい値より小さい場合、2 つの浮動小数点数は等しいと見なされます。

    次のコード:

    リーリー

    これが起こる理由は、コンピューター自体がデータを表すために 01 バイナリを使用しているためです。

    基本的には次のように理解できます。

    コンピュータ内部の浮動小数点数の保存形式により、メモリに保存される浮動小数点数の多くは、できるだけ近い形式でのみ保存されます

    ご興味がございましたら、さらに詳しくご覧ください。

    ブログガーデンの記事

    返事
    0
  • キャンセル返事