It is common knowledge that one has to be careful when comparing floating point values. Usually, instead of using ==
, we use some epsilon or ULP based equality testing.
However, I wonder, are there any cases, when using ==
is perfectly fine?
Look at this simple snippet, which cases are guaranteed to succeed?
void fn(float a, float b) {
float l1 = a/b;
float l2 = a/b;
if (l1==l1) { } // case a)
if (l1==l2) { } // case b)
if (l1==a/b) { } // case c)
if (l1==5.0f/3.0f) { } // case d)
}
int main() {
fn(5.0f, 3.0f);
}
Note: I've checked this and this, but they don't cover (all of) my cases.
Note2: It seems that I have to add some plus information, so answers can be useful in practice: I'd like to know:
- what the C++ standard says
- what happens, if a C++ implementation follows IEEE-754
This is the only relevant statement I found in the current draft standard:
The value representation of floating-point types is implementation-defined. [ Note: This document imposes no requirements on the accuracy of floating-point operations; see also [support.limits]. — end note ]
So, does this mean, that even "case a)" is implementation defined? I mean, l1==l1
is definitely a floating-point operation. So, if an implementation is "inaccurate", then could l1==l1
be false?
I think this question is not a duplicate of Is floating-point == ever OK?. That question doesn't address any of the cases I'm asking. Same subject, different question. I'd like to have answers specifically to case a)-d), for which I cannot find answers in the duplicated question.
==
. – Achillesa==a
cannot be trusted to be true. – Autotrophica == a
. It would probably improve this question to make it only abouta == a
however, as the other cases are covered by the "duplicate" or other questions – Ready