首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分零和负零

区分零和负零
EN

Stack Overflow用户
提问于 2014-01-06 17:15:56
回答 3查看 3.7K关注 0票数 10

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

EN

回答 3

Stack Overflow用户

发布于 2014-01-06 17:22:23

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

票数 18
EN

Stack Overflow用户

发布于 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。一个简单的检查是

代码语言:javascript
复制
bool is_negative_zero(float val)
{
   return ((val == 0.0f) && std::signbit(val));
}

0.0f == -0.0f开始,这就起作用了,尽管有些地方符号会产生差异,比如atan2,或者除以-0而不是+0会导致相应的无穷大。

票数 9
EN

Stack Overflow用户

发布于 2017-11-18 05:25:43

要在C中显式测试== -0,请执行以下操作:

代码语言:javascript
复制
if (*((long *)&a) == 0x8000000000000000) {
    //  a is -0
}
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20946566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档