I researched this a lot and I know something about precision errors in the doubles; however I couldnt find the answer. My question is: is it always safe to compare double constants? What do I mean by that is, just reading the double from a string or creating in the source code. No operation (adding, subtracting etc.) will be done on them. If I create a variable like
double c = 3.0.
Will the following equation will always be true? c==3.0000.
For example is there any possibility to see wrong evaluation of an equation like this 1.23456789 < 1.23456788?
Advertisement
Answer
It’s always safe; with one caveat.
Here’s an example:
1.232342134214321412421 == 1.232342134214321412422
That is true; all double constants are silently rounded to the nearest representable double, and for both of these numbers, it is the same double.
Thus, given 2 actual mathematical numbers A and B where A < B
, then if you turn those numbers into double literals and run these 3 expressions on it, you get the following scenarios:
If A and B are rounded to different doubles, you get guarantees:
A < B
will be trueA == B
will be falseA > B
will be false
If A and B are really close to each other, they may round to the same double, and you get:
A < B
will be falseA == B
will be trueA > B
will be false
In other words, ‘less than’ and ‘greater than’ can be bent into being equal, but a lesser number will never be erroneously treated as larger.