【问题标题】:How to compare two NAN values in C++如何在 C++ 中比较两个 NAN 值
【发布时间】:2013-02-22 12:20:14
【问题描述】:

我有一个代码区域产生 NAN 值的应用程序。我必须比较相等的值并在此基础上执行其余代码。如何比较 C++ 中的两个 NAN 值是否相等?

【问题讨论】:

    标签: c++ compare nan


    【解决方案1】:

    假设 IEEE 754 浮点表示,您无法比较两个 NaN 值是否相等。 NaN 不等于任何值,包括它自己。但是,您可以使用 <cmath> 标头中的 std::isnan 测试它们是否都是 NaN:

    if (std::isnan(x) && std::isnan(y)) {
      // ...
    }
    

    不过,这仅在 C++11 中可用。在 C++11 之前,Boost Math Toolkit 提供了一些 floating point classifiers。或者,您可以通过与自身进行比较来检查值是否为 NaN:

    if (x != x && y != y) {
      // ...
    }
    

    因为 NaN 是唯一不等于自身的值。过去,某些编译器把它搞砸了,但我目前不确定状态(它似乎与 GCC 一起正常工作)。

    MSVC 提供了一个_isnan 函数。

    最后一种选择是假设您知道表示是 IEEE 754 并进行一些位检查。显然这不是最便携的选择。

    【讨论】:

    • 我添加了 boost 解决方案作为另一个答案。
    • @BartekBanachewicz 啊!我也只是将它添加到我的!
    • 谢谢大家。如果这个问题没有任何意义,我很抱歉。只是很想知道这是否可能。'isnan' 功能将为我的情况做点什么。
    【解决方案2】:

    关于 C++11 之前的版本,there's a boost for that, too.

    #include <boost/math/special_functions/fpclassify.hpp>
    
    template <class T>
    bool isnan(T t); // NaN.
    

    【讨论】:

      【解决方案3】:

      任何给定的 NaN 都不等于任何东西,它永远不会等于任何其他 NaN,因此将它们相互比较是徒劳的。

      来自 GNU 文档:

      NaN 是无序的:它不等于、大于或小于任何东西,包括它自己。如果 x 的值为 NaN,x == x 为 false。 source

      【讨论】:

      • @Aki erm,0.0/0.0 是 NaN。我看不出这里的“相反”是什么。
      猜你喜欢
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2021-11-30
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多