繁体   English   中英

区分零和负零

[英]Distinguish zero and negative zero

我在代码中遇到了一个函数返回双精度型的情况,而该双精度型可能是零,负零或完全是另一个值。 我需要区分零和负零,但默认的双重比较不需要。 由于双精度格式,C ++不允许使用按位运算符比较双精度,因此我不确定如何继续。 如何区分两者?

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

由于双精度格式,C ++不允许使用按位运算符比较双精度,因此我不确定如何继续。

首先,C ++对float / double float类型没有任何float标准。

假设您正在谈论IEEE 754的binary32binary64格式,则将它们专门设计为在将位模式解释为整数时保持其顺序,以便非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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM