のようなコードを使用するには、トラップ、スネアや抜け穴の世界へようこそ。他のところで述べたように、浮動小数点の等価性と公差の汎用ソリューションはではなく、が存在します。それを考えると、プログラマが選択した場合に使用できるツールと公理があります。
fabs(a_float - b_float) < tol
には、次のような欠点があります。「a_floatが非常に小さいか、または非常に大きい可能性がある一般的なケースではうまく機能しません。 fabs(a_float - ref_float) <= fabs(ref_float * tol)
はバリアントの範囲にはるかに優れています。
OPの「浮動小数点数単精度を使用TOL = 10E-6は」CおよびC++のためのビット気になることがようになるので、容易double
にfloat
算術を促進し、それはdouble
の「寛容」だないfloat
遊びます。 float f = 1.0; printf("%.20f\n", f/7.0);
を考えてください多くの新しいプログラマーは7.0
がdouble
の精度計算を引き起こしたことを認識しません。大量のデータがより小さいサイズのfloat
を必要とする場合を除き、double
を使用することをお勧めします。
C99には、「許容値」の測定に役立つnextafter()
があります。それを使用して、次の表現可能な数を決定することができます。これはOPの助けになる "...丸め誤差を可能にするストレージタイプマイナス1のための有効桁の完全数...。」if ((nextafter(x, -INF) <= y && (y <= nextafter(x, +INF))) ...
tol
の種類または 『使用公差は、』多くの場合、問題の核心である。ほとんどの場合、(私見)相対公差は重要である。例えば?たまに絶対許容度が必要とされている「0.0001%以内xとyのです」。例えば「0.0001内でのxとyは」?
寛容の値多くの場合、状況に応じて最適な値が決定されるため、議論の余地があります。ドルではなく、円ではない。 (ヒント:簡単な更新を可能にするコーディングスタイルを使用してください)
:代わりに、一定の許容範囲の
、あなたはおそらくのようにイプシロンの要因を使用することができますか? – NINCOMPOOP
完全精度を求めている場合は、有理数ライブラリの1つを使用できます。 –
Q:すべての一般的なケースに対して 'tol'を正しく計算するにはどうすればよいですか? A:そうではありません。許容値にかかわらず、この種の比較はすべての場合に適していません(そしてFWIWは、あなたがテストしているものに対して適切な許容値が*何かを最もよく知っているでしょうか?) –