Exact equality comparison against a floating-point literal
ID |
c.correctness.float_equality |
Severity |
low |
Remediation Complexity |
medium |
Remediation Risk |
medium |
Remediation Effort |
low |
Resource |
Numeric |
Language |
C / C++ |
Description
This uses == or != to compare against a floating-point literal. Floating-point values are approximations, so exact equality rarely holds after arithmetic and gives surprising results. Compare against a tolerance instead, e.g. fabs(x - expected) < epsilon.
Rationale
This uses == or != to compare against a floating-point literal. Floating-point values are approximations, so exact equality rarely holds after arithmetic and gives surprising results. Compare against a tolerance instead, e.g. fabs(x - expected) < epsilon.
The following code illustrates the pattern detected by this rule:
void check(double d, float f) {
// FLAGGED: Exact equality comparison against a floating-point literal
if (d == 1.0) {
printf("one\n");
}
// FLAGGED: Exact equality comparison against a floating-point literal
if (3.14 == d) {
printf("pi\n");
}
// FLAGGED: Exact equality comparison against a floating-point literal
if (f != 0.5f) {
printf("not half\n");
}
}