如何在C ++中比较两个NAN值

时间:2013-03-07 10:35:51

标签: c++ compare nan

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

3 个答案:

答案 0 :(得分:18)

假设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并进行一些检查。显然这不是最便携的选择。

答案 1 :(得分:3)

关于pre-C ++ 11,there's a boost for that, too

#include <boost/math/special_functions/fpclassify.hpp>

template <class T>
bool isnan(T t); // NaN.

答案 2 :(得分:2)

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

来自GNU docs:

  

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