比较相等是否可以使用`==`?

时间:2010-02-11 06:01:58

标签: c++ equality

比较平等时,可以使用==吗?

例如:

int a = 3;
int b = 4;

如果要检查是否相同,请使用:

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

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

6 个答案:

答案 0 :(得分:15)

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

你应该比较浮点数是否相等;使用容忍方法:

if (fabs(a - b) < tolerance)
{
   // a and b are equal to within tolerance
}

答案 1 :(得分:3)

重新浮动点:是的。不要将==用于浮点数(或者如果你这样做,则完全知道你正在做什么)。而是使用像

这样的东西
if (fabs(a - b) < SOME_DELTA) {
  ...
}

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

答案 2 :(得分:2)

在许多课程中,operator==通常实现为(!(a < b || b < a)),因此您应该继续使用==。除了漂浮物,正如Mitch Wheat所说。

答案 3 :(得分:2)

做&lt;和&gt;比较并不能真正帮助您解决舍入错误。使用Mark Shearar给出的解决方案。但浮点数的直接相等比较并不总是坏的。如果某个特定值(例如0.0或1.0)直接分配给变量,则可以使用它们,以检查变量是否仍具有该值。只有在计算之后,舍入错误才会搞平等检查。

请注意,将NaN值与任何(也是另一个NaN)与&lt;,&gt;,&lt; =,&gt; =或==进行比较会返回false。 !=返回true。

答案 4 :(得分:1)

在比较整数时,使用==。使用“&lt;”和“&gt;”同时检查int上的相等会导致代码变慢,因为它需要两次比较而不是一次,需要花费两倍的时间。 (尽管编译器可能会为你修复它,但你不应该习惯于编写错误的代码)。

请记住,早期优化很糟糕,但早期效率低下的代码同样糟糕。

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

答案 5 :(得分:1)

对于整数,==符合您的期望。如果他们是平等的,他们是平等的。

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

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

其中float_t是typedef;这给了我尽可能多的精度(假设error_margin被正确计算)并且允许轻松调整到另一种类型。

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

最后,有正负零,它们是截然不同的,但彼此相等!要分离它们,您需要执行诸如检查逆是正还是负无穷大的操作。 (只要确保你不会得到除零例外。)

所以,除非你有一个更具体的问题,我希望能处理它......