【发布时间】:2013-02-22 12:20:14
【问题描述】:
我有一个代码区域产生 NAN 值的应用程序。我必须比较相等的值并在此基础上执行其余代码。如何比较 C++ 中的两个 NAN 值是否相等?
【问题讨论】:
我有一个代码区域产生 NAN 值的应用程序。我必须比较相等的值并在此基础上执行其余代码。如何比较 C++ 中的两个 NAN 值是否相等?
【问题讨论】:
假设 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 并进行一些位检查。显然这不是最便携的选择。
【讨论】:
关于 C++11 之前的版本,there's a boost for that, too.
#include <boost/math/special_functions/fpclassify.hpp>
template <class T>
bool isnan(T t); // NaN.
【讨论】:
任何给定的 NaN 都不等于任何东西,它永远不会等于任何其他 NaN,因此将它们相互比较是徒劳的。
来自 GNU 文档:
NaN 是无序的:它不等于、大于或小于任何东西,包括它自己。如果 x 的值为 NaN,
x == x为 false。 source
【讨论】: