我在代码中遇到了这样一种情况,一个函数返回一个双精度值,这个双精度值可能是零、负零,或者完全是另一个值。我需要区分零和负零,但默认的双重比较不需要。由于doubles的格式,C++不允许使用按位运算符比较doubles,因此我不确定如何继续。我如何区分这两者呢?
发布于 2014-01-06 17:22:23
调用std::signbit()以确定符号位的状态。
发布于 2014-01-06 17:28:27
由于doubles的格式,C++不允许使用按位运算符比较doubles,因此我不确定如何继续。
首先,C++没有为float/double类型规定任何标准。
假设您正在谈论IEEE754的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会导致相应的无穷大。
发布于 2017-11-18 05:25:43
要在C中显式测试== -0,请执行以下操作:
if (*((long *)&a) == 0x8000000000000000) {
// a is -0
}https://stackoverflow.com/questions/20946566
复制相似问题