![](/img/trans.png)
[英]NAN -> distinguish between a division by zero and an exponent with a very large negative value
[英]Distinguish zero and negative zero
我在代码中遇到了一个函数返回双精度型的情况,而该双精度型可能是零,负零或完全是另一个值。 我需要区分零和负零,但默认的双重比较不需要。 由于双精度格式,C ++不允许使用按位运算符比较双精度,因此我不确定如何继续。 如何区分两者?
调用std::signbit()
确定符号位的状态。
由于双精度格式,C ++不允许使用按位运算符比较双精度,因此我不确定如何继续。
首先,C ++对float
/ double
float
类型没有任何float
标准。
假设您正在谈论IEEE 754的binary32和binary64格式,则将它们专门设计为在将位模式解释为整数时保持其顺序,以便非FPU可以对其进行排序。 这就是他们的指数有偏差的原因。
有很多SO帖子讨论这种比较。 这是最相关的 。 一个简单的检查是
bool is_negative_zero(float val)
{
return ((val == 0.0f) && std::signbit(val));
}
自0.0f == -0.0f
以来,这是0.0f == -0.0f
,尽管在某些地方,符号会像atan2
那样产生差异,或者在除以-0而不是+0时会导致各自的无限性。
要在C中显式测试a == -0,请执行以下操作:
if (*((long *)&a) == 0x8000000000000000) {
// a is -0
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.