区分零和负零C++

Dan*_*ner 8 c++ floating-point comparison zero negative-number

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

Dav*_*nan 16

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


leg*_*s2k 8

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

首先,C++没有强制要求float/ double类型的任何标准.

假设您正在谈论IEEE 754的binary32binary64格式,它们专门设计用于在其位模式被解释为整数时保持其顺序,以便非FPU可以对它们进行排序; 这就是他们有偏见指数的原因.

很多SO帖子在讨论这种比较; 这是最相关的一个.一个简单的检查

bool is_negative_zero(float val)
{
   return ((val == 0.0f) && std::signbit(val));
}
Run Code Online (Sandbox Code Playgroud)

这是有效的0.0f == -0.0f,尽管有标志产生差异的地方,atan2或者除以-0而不是+0导致各自的无穷大.