5

比较相等时可以使用==吗?

例如:

int a = 3;
int b = 4;

如果检查是否相等,您应该使用:

if (a == b)
{
     . . .
}

如果使用浮点数,情况会改变吗?

4

6 回答 6

15

' ==' 非常适合整数值。

您不应该比较浮点数是否相等;使用公差方法:

if (fabs(a - b) < tolerance)
{
   // a and b are equal to within tolerance
}
于 2010-02-11T06:05:23.047 回答
3

重新浮点数:是的。不要将 == 用于浮点数(或者如果你这样做,就知道你在做什么)。而是使用类似的东西

if (fabs(a - b) < SOME_DELTA) {
  ...
}

编辑:将 abs() 更改为 fabs()

于 2010-02-11T06:05:56.493 回答
2

在许多类中,operator==通常实现为(!(a < b || b < a)),因此您应该继续使用 ==。正如米奇小麦上面所说的那样,除了花车。

于 2010-02-11T06:12:21.840 回答
2

进行 < 和 > 比较并不能真正帮助您解决舍入错误。使用 Mark Shearar 给出的解决方案。不过,浮点数的直接相等比较并不总是坏事。如果某些特定值(例如 0.0 或 1.0)直接分配给变量,您可以使用它们来检查变量是否仍然具有该值。只有在计算之后,舍入误差才会破坏相等性检查。

请注意,使用 <、>、<=、>= 或 == 将 NaN 值与任何值(也是另一个 NaN)进行比较会返回 false。!= 返回真。

于 2010-02-11T06:44:02.777 回答
1

对于整数,==做你所期望的。如果他们是平等的,他们是平等的。

对于花车,这是另一回事。操作产生不精确的结果并且错误累积。处理数字时你需要有点模糊。我用

if ( std::abs( a - b )
    < std::abs( a ) * ( std::numeric_limits<float_t>::epsilon() * error_margin ) )

在哪里float_ttypedef这给了我尽可能高的精度(假设 error_margin 计算正确)并允许轻松调整到另一种类型。

此外,一些浮点值不是数字:有无穷大、负无穷大,当然也不是数字。==用那些做有趣的事情。无穷大等于无穷大,但非数不等于非数。

最后,有正负零,它们不同但彼此相等!为了将它们分开,您需要检查逆是正无穷还是负无穷。(只要确保不会出现被零除的异常。)

所以,除非你有更具体的问题,我希望能处理它……</p>

于 2010-02-11T06:28:24.733 回答
1

比较整数时,使用 ==。同时使用“<”和“>”来检查 int 上的相等性会导致代码变慢,因为它需要两次比较而不是一次,花费双倍的时间。(尽管编译器可能会为您修复它,但您不应该习惯于编写糟糕的代码)。

请记住,早期优化是不好的,但早期的低效代码同样糟糕。

编辑:修正了一些英文...

于 2010-02-11T06:08:58.360 回答