我在代码中遇到一种情况,一个函数返回一个double类型的值,这个值可能是0、负0或其他值。我需要区分0和负0,但默认的double比较方法不能区分。由于double类型的格式,C++不允许使用位运算符比较double类型的值,因此我不知道该怎么办。如何区分这两个值?
我在代码中遇到一种情况,一个函数返回一个double类型的值,这个值可能是0、负0或其他值。我需要区分0和负0,但默认的double比较方法不能区分。由于double类型的格式,C++不允许使用位运算符比较double类型的值,因此我不知道该怎么办。如何区分这两个值?
首先,C++并没有对/类型规定任何标准。
假设您正在谈论IEEE 754的binary32和binary64格式,则它们专门设计为在将其位模式解释为整数时保持其顺序,以便非FPU可以对其进行排序;这就是它们具有偏置指数的原因。
有许多SO帖子讨论此类比较;这里是最相关的一个。一个简单的检查方法是
bool is_negative_zero(float val)
{
return ((val == 0.0f) && std::signbit(val));
}
0.0f == -0.0f
,但在像atan2
这样的地方,符号会产生影响,或者当除以-0而不是+0导致相应的无穷大时。要在C语言中明确测试a是否等于-0,请按照以下步骤进行:
if (*((long *)&a) == 0x8000000000000000) {
// a is -0
}
long
与double
大小相同时,才能这样做... - Toby Speight
1e-300 / -1e300
。 - Oliver Charlesworth