我有一个旨在测试“边角-边”三角形的各种实例的程序,但我收到警告,我认为这可能会破坏我的程序。
基本上,我有两个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)) {
^
我不知道该如何处理,无法找到在线方法。
答案 0 :(得分:1)
在比较浮点数是否相等时,应始终检查差异是否小于某个阈值。因此,您不必检查a == b,而应检查abs(a-b) 这是由于浮动值的内在不准确性以及以下事实造成的:即使看起来很精确,其二进制表示形式也可能不精确