区分零和负零C ++

时间:2014-01-06 09:15:56

标签: c++ floating-point comparison zero negative-number

我在代码中遇到函数返回double的情况,并且此double可能完全为零,负零或其他值。我需要区分零和负零,但默认的双重比较不会。由于双精度的格式,C ++不允许使用按位运算符比较双精度,所以我不确定如何进行。我如何区分这两者?

3 个答案:

答案 0 :(得分:15)

调用std::signbit()以确定符号位的状态。

答案 1 :(得分:7)

  

由于双精度格式,C ++不允许使用按位运算符比较双精度数,所以我不确定如何进行。

首先,C ++并未强制要求float / double类型的任何标准。

假设您正在谈论IEEE 754的 binary32 binary64 格式,它们专门用于在bit patterns are interpreted as integers时保持其顺序,以便非-FPU可以对它们进行排序;这就是他们有偏见指数的原因。

many SO posts讨论这种比较;这是the most relevant one。一个简单的检查将是

bool is_negative_zero(float val)
{
   return ((val == 0.0f) && std::signbit(val));
}

这是0.0f == -0.0f以来的作品,虽然有些地方标志会产生差异,例如atan2,或者除以-0而不是+0导致相应的无穷大。

答案 2 :(得分:0)

要在C中明确测试== -0,请执行以下操作:

if (*((long *)&a) == 0x8000000000000000) {
    //  a is -0
}