代码之家  ›  专栏  ›  技术社区  ›  Ken Y-N

是!南不是南?

  •  6
  • Ken Y-N  · 技术社区  · 6 年前

    我遇到了这个代码,它发出警告 gcc :

    float f;
    // Calculate a value for f
    if (!f == 0.0)
    {
        // Handle it being non-zero
    }
    

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

    if (f != 0.0)
    // OR
    if (!(f == 0.0))
    

    我已经更正了代码,但我只是想知道 !NaN 进行评估。我们使用 f 内部值 if ,所以我们不想 NaN 过了支票。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Alan Birtles    6 年前

    https://en.cppreference.com/w/cpp/language/implicit_conversion

    整型、浮点型、非范围枚举型、指针型和指向成员类型的指针型的prvalue可以转换为bool类型的prvalue。

    值零(对于整数、浮点和非范围枚举)和空指针以及指向成员值的空指针变为假。所有其他值都变为真

    因此 !f == 0.0 等于 !(f != 0.0) == 0.0 (f == 0.0) == false f != 0.0

        2
  •  3
  •   P.W    6 年前

    如果你想避免一个南在里面 if ,您可以使用该函数

    bool isnan( float arg );

    进行检查。

    reference 功能:

    NaN值从不与自身或其他NaN值进行比较。 根据IEEE-754,复制NAN并不需要保留其位表示(符号和有效负载),尽管大多数实现都需要。

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

    bool is_nan(double x) { return x != x; } 
    

    C++草案(N47 13)表示:

    8.5.2.1一元运算符[expr.unary.op]

    9。逻辑否定运算符的操作数 ! 上下文转换为bool (第7条);其价值为 true 如果转换的操作数是 false 否则。 结果类型为bool .

    7.14布尔转换[conv.bool]
    1。算术、非范围枚举、指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。零值、空指针值或空成员指针值转换为false; 任何其他值都将转换为true。

    结论: 当NaN上下文转换为 在表达式中 !NaN , !南 因此 不是南 .

        3
  •  0
  •   chameleon123    6 年前

    简单使用

    if (!isnan(f)&& !f == 0.0)
        {
            cout<<"Filtered NaN values"<<endl;
    
        }