1

重複の可能性:
浮動小数点と二重比較の最も効果的な方法
浮動小数点値を比較することはどれほど危険ですか?

私は持っconst float M = 0.000001;ていfloat input;ます。平等チェックはしたくない。しかし、直接チェックには副作用があることを私は知っていますM != input。だから、副作用なしに2つのフロート値を比較するにはどうすればよいですか?

4

2 に答える 2

3
const double epsilon = 1e-12; 

if(fabs(input - M) < epsilon) //input == M
{
    //...
}
if(fabs(input - M) >= epsilon) // input != M
{
    //...
}

イプシロンの値が小さいほど、比較の精度が高くなります。したがって、2つの値が等しくないと見なされるのに、2つの値が等しくないことがわかる可能性が高くなります。イプシロンの値が大きいほど、実際には等しくないようにしたかったのに、結果が等しいと表示される可能性が高くなります。イプシロンの値は、目前のタスクの詳細に従って選択する必要があります。

于 2012-11-06T11:14:55.267 に答える
0

フロートを比較するときは、「等しい」ではなく「近い」かどうかを比較する必要があります。必要に応じて「クローズ」を定義する方法は複数あります。ただし、典型的なアプローチは次のようなものです。

namespace FloatCmp {

const float Eps = 1e-6f;

bool eq(float a, float b, float eps = Eps) {
  return fabs(a - b) < eps;
}

//etc. for neq, lt, gt, ...

}

次に、フロートを比較するFloatCmp::eq()代わりに使用します。==

于 2012-11-06T11:17:31.397 に答える