哪些类型可以安全地与 == 进行比较?

问题描述 投票:0回答:6

比较相等时可以使用

==
吗?

例如:

int a = 3;
int b = 4;

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

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

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

c++ floating-point equality
6个回答
15
投票

'

==
' 对于整数值来说非常好。

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

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

3
投票
关于浮点数:是的。不要对浮点数使用 == (或者如果使用的话,请确切地知道你在做什么)。而是使用类似的东西

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

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


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

< and >请注意,使用

= 或 == 将 NaN 值与任何值(也是另一个 NaN)进行比较都会返回 false。 != 返回 true。<, > <=, >


2
投票
operator==

通常被实现为

(!(a < b || b < a))
,所以你应该继续使用==。正如 Mitch Wheat 上面所说,除了浮动之外。
    


1
投票
”来检查 int 的相等性会导致代码变慢,因为它需要进行两次比较而不是一次比较,从而花费双倍的时间。 (尽管编译器可能会为您修复它,但您不应该习惯编写糟糕的代码)。

<" and ">请记住,早期优化不好,但早期低效代码也同样糟糕。

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


1
投票
==

正如您所期望的那样。如果它们相等,它们就相等。


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

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

其中 
float_t

是 typedef;这给了我尽可能多的精度(假设 error_margin 计算正确),并允许轻松调整到其他类型。


此外,一些浮点值不是数字:有无穷大、负无穷大,当然还有非数字。

==

用这些做有趣的事情。无穷大等于无穷大,但非数不等于非数。


最后,还有正零和负零,它们不同但彼此相等!要分离它们,您需要执行一些操作,例如检查倒数是正无穷大还是负无穷大。 (只要确保不会出现被零除的异常即可。)

所以,除非您有更具体的问题,否则我希望能够解决它......

© www.soinside.com 2019 - 2024. All rights reserved.