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