我有一个代码区域产生 NAN 值的应用程序。我必须比较相等的值并在此基础上执行其余代码。如何比较 C++ 中的两个 NAN 值是否相等?
问问题
9209 次
3 回答
25
假设 IEEE 754 浮点表示,您不能比较两个 NaN 值是否相等。NaN 不等于任何值,包括它自己。std::isnan
但是,您可以从<cmath>
标题中测试它们是否都是 NaN :
if (std::isnan(x) && std::isnan(y)) {
// ...
}
但是,这仅在 C++11 中可用。在 C++11 之前,Boost Math Toolkit提供了一些浮点分类器。或者,您可以通过将其与自身进行比较来检查值是否为 NaN:
if (x != x && y != y) {
// ...
}
因为 NaN 是唯一不等于自身的值。过去,某些编译器把它搞砸了,但我目前不确定状态(它似乎与 GCC 一起正常工作)。
MSVC 提供了一个_isnan函数。
最后一种选择是假设您知道表示是 IEEE 754 并进行一些位检查。显然这不是最便携的选择。
于 2013-03-07T10:39:32.050 回答
3
关于 C++11 之前的版本,这也有所提升。
#include <boost/math/special_functions/fpclassify.hpp>
template <class T>
bool isnan(T t); // NaN.
于 2013-03-07T10:50:47.567 回答
1
任何给定的 NaN 都不等于任何东西,它永远不会等于任何其他 NaN,因此将它们相互比较是徒劳的。
来自 GNU 文档:
NaN 是无序的:它不等于、大于或小于任何东西,包括它自己。
x == x
如果 x 的值为 NaN,则为 false。来源
于 2013-03-07T10:38:53.663 回答