开发者

Comparing floating point values

I just read a statement about the floating point value comparison

Floating point values shall not be compared u开发者_JAVA技巧sing either the == or != operators. Most floating point values have no exact binary representation and have a limited precision.

If so what is the best method for comparing two floating point values?


The following extension methods may be useful to implement Kevin's suggestion:

public static bool IsEqualTo(this double a, double b, double margin)
{
    return Math.Abs(a - b) < margin;
}

public static bool IsEqualTo(this double a, double b)
{
    return Math.Abs(a - b) < double.Epsilon;
}

So now you can just do:

if(x1.IsEqualTo(x2)) ...
if(x1.IsEqualTo(x2, 0.01)) ...

Just change the IsEqualTo to a more appropriate name, or change the default margin to anything better than double.Epsilon, if needed.


Generally floating point numbers should be compared using a construct like

if( abs((x1 - x2) < 0.001) )

The reason for the warning you quoted is you may have two methods of calculating something, and they may be equal if you had no rounding error, but the rounding error makes them slightly different.


"Best method" depends on the circumstances of why you want to compare the numbers. In general, if you think you want to check if 2 floating points numbers are equal, you are doing something wrong.

Floating point numbers are supposed to be used to represent real values, in both senses of the word. Is this object the same length as this other object? Well, they may look the same length, but if you get a good enough measuring device, you can always find a difference. Similarly, two floating point numbers are never equal, unless they are measuring the same thing, and have been processed in exactly the same way. Other than that, it's just a rounding error somewhere in the system.

You might want to check that they are close, (closer than a certain threshold) as the other answers have suggested, but not equal.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜