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

本质上,我有两个if语句

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


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

其中sideA,sideB和angA均为 double ,并且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)) {
                                       ^

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

最佳答案

比较浮点数是否相等时,应始终检查差异是否小于某个阈值。因此,您不必检查a == b,而应检查abs(a-b)
这是由于 float 值的内在不准确性,以及以下事实:即使它看起来准确,其二进制表示形式也可能不精确

10-08 08:18