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