CodeQL 文档

浮点数的相等性测试

ID: cpp/equality-on-floats
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - reliability
   - correctness
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

此规则查找对浮点值使用相等 (==) 运算符进行比较的情况。此类比较可能会由于转换或舍入错误导致意外结果。如果您正在处理非常大或非常小的浮点值,请特别注意,因为使用此类值时舍入错误会更加明显。

建议

如果浮点数之间的差值在适当的误差范围内,则应认为它们相等。

示例

//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 月 (在线提供).

  • ©GitHub, Inc.
  • 条款
  • 隐私