首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是!NaN不是NaN吗?

是!NaN不是NaN吗?
EN

Stack Overflow用户
提问于 2018-10-22 06:18:11
回答 3查看 530关注 0票数 6

我偶然发现了一段用gcc发出警告的代码

代码语言:javascript
复制
float f;
// Calculate a value for f
if (!f == 0.0)
{
    // Handle it being non-zero
}

这可能只是另一个团队成员的错误,检查代码的真正含义是:

代码语言:javascript
复制
if (f != 0.0)
// OR
if (!(f == 0.0))

我已经更正了代码,但我只是想知道!NaN的计算结果是什么。我们在f中使用if值,所以我们不希望NaN通过检查。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-22 07:12:06

请参阅转换

整数、浮点、非作用域枚举、指针和指针到成员类型的prvalue可以转换为类型bool的prvalue。 值零(用于整数、浮点和非作用域枚举)以及空指针和空指针到成员的值变为假。所有其他的价值都变成了现实

因此,!f == 0.0等同于!(f != 0.0) == 0.0(f == 0.0) == falsef != 0.0

票数 2
EN

Stack Overflow用户

发布于 2018-10-22 06:42:04

如果要避免在NaN中使用if,可以使用该函数

bool isnan( float arg );

进行检查。

函数的参考文献

NaN值从来不等于自身或其他NaN值。IEEE-754不需要复制NaN来保留其位表示形式(符号和有效负载),尽管大多数实现都是这样做的。

另一种测试浮点值是否为NaN的方法是将其与自身进行比较:

代码语言:javascript
复制
bool is_nan(double x) { return x != x; } 

C++草案(N4713)规定:

8.5.2.1一元运算符expr.unary.op ..。 9.逻辑否定运算符! 的操作数在上下文上转换为bool (第7条);如果转换后的操作数为false,则值为false。结果的类型是bool。 7.14布尔变换conv.bool 1.算术、非作用域枚举、指针或指针到成员类型的prvalue可以转换为bool类型的prvalue。零值、空指针值或空成员指针值转换为false;任何其他值都转换为真。。

结论: As NaN在表达式!NaN中被上下文转换为true!NaNfalse,因此不是NaN。

票数 3
EN

Stack Overflow用户

发布于 2018-10-22 06:47:16

简单地使用

代码语言:javascript
复制
if (!isnan(f)&& !f == 0.0)
    {
        cout<<"Filtered NaN values"<<endl;

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52923346

复制
相关文章

相似问题

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