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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With