比较相等时可以使用
==
吗?
例如:
int a = 3;
int b = 4;
如果检查相等性,您应该使用:
if (a == b)
{
. . .
}
如果使用浮点数,情况会改变吗?
'
==
' 对于整数值来说非常好。
你不应该比较浮点数是否相等;使用宽容的方法:
if (fabs(a - b) < tolerance)
{
// a and b are equal to within tolerance
}
if (fabs(a - b) < SOME_DELTA) {
...
}
编辑:将abs()更改为fabs()
< and >请注意,使用
、= 或 == 将 NaN 值与任何值(也是另一个 NaN)进行比较都会返回 false。 != 返回 true。<, > <=, >
operator==
通常被实现为
(!(a < b || b < a))
,所以你应该继续使用==。正如 Mitch Wheat 上面所说,除了浮动之外。<" and ">请记住,早期优化不好,但早期低效代码也同样糟糕。
编辑:修复了一些英语...
==
正如您所期望的那样。如果它们相等,它们就相等。
对于花车来说,则是另一回事了。操作会产生不精确的结果,并且错误会不断累积。处理数字时你需要有点模糊。我用
if ( std::abs( a - b )
< std::abs( a ) * ( std::numeric_limits<float_t>::epsilon() * error_margin ) )
其中
float_t
是 typedef;这给了我尽可能多的精度(假设 error_margin 计算正确),并允许轻松调整到其他类型。
此外,一些浮点值不是数字:有无穷大、负无穷大,当然还有非数字。
==
用这些做有趣的事情。无穷大等于无穷大,但非数不等于非数。
最后,还有正零和负零,它们不同但彼此相等!要分离它们,您需要执行一些操作,例如检查倒数是正无穷大还是负无穷大。 (只要确保不会出现被零除的异常即可。)
所以,除非您有更具体的问题,否则我希望能够解决它......