我在相等测试布尔运算符上遇到问题

时间:2019-10-08 09:21:57

标签: c++ floating-point warnings

我有一个旨在测试“边角-边”三角形的各种实例的程序,但我收到警告,我认为这可能会破坏我的程序。

基本上,我有两个if语句

if (sideA == sideB * sin(angA))

 else if (sideB > sideA && sideA > sideB * sin(angA))

其中sideA,sideB和angA均为双精度数,并且将angA输入为度,并通过等式angA = angA * 3.14159 / 180转换为弧度。

我遇到的问题是我的程序在应该阅读前者时正在阅读后者。具体来说,当我输入sideA为5,sideB为10和angA为30时,表达式sideB * sin(angA)读为5。但是由于某种原因,与其遵循“ 5 == 5,因此第一个if语句应运行”,“ else if”语句的内容正在运行。

在我看来,这个问题不太可能的原因是,我对使用的PI位数太保守了,应该增加它;更有可能的原因是我收到的警告状态

warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
     else if (sideA == sideB * sin(angA)) {
                                       ^

我不知道该如何处理,无法找到在线方法。

1 个答案:

答案 0 :(得分:1)

在比较浮点数是否相等时,应始终检查差异是否小于某个阈值。因此,您不必检查a == b,而应检查abs(a-b)

这是由于浮动值的内在不准确性以及以下事实造成的:即使看起来很精确,其二进制表示形式也可能不精确