Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparing floating point values

I just read a statement about the floating point value comparison

Floating point values shall not be compared using 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?

like image 616
Sauron Avatar asked Oct 07 '09 07:10

Sauron


3 Answers

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.

like image 92
Konamiman Avatar answered Oct 27 '22 00:10

Konamiman


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.

like image 35
Kevin Peterson Avatar answered Oct 27 '22 01:10

Kevin Peterson


"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.

like image 36
rjmunro Avatar answered Oct 27 '22 02:10

rjmunro