浮点数的相等性测试¶
ID: cpp/equality-on-floats
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- reliability
- correctness
Query suites:
- cpp-security-and-quality.qls
此规则查找对浮点值使用相等 (==
) 运算符进行比较的情况。此类比较可能会由于转换或舍入错误导致意外结果。如果您正在处理非常大或非常小的浮点值,请特别注意,因为使用此类值时舍入错误会更加明显。
建议¶
如果浮点数之间的差值在适当的误差范围内,则应认为它们相等。
示例¶
//wrong: could evaluate to 0 (false) due to rounding errors
23.42f == 23.42
//wrong: could evaluate to 1 (true) due to rounding errors
1000000000.0f == 1000000001.0f
//correct: use a margin of error to check equality
fabs(f1 - f2) < EPSILON
参考文献¶
D. Goldberg,每个计算机科学家都应该了解的浮点运算,ACM 计算机调查,第 23 卷,第 1 期,1991 年 3 月 (在线提供).