13

コード領域が NAN 値を生成するアプリケーションがあります。等しいかどうかの値を比較し、それに基づいて残りのコードを実行する必要があります。C++ で 2 つの NAN 値を等しいかどうか比較する方法は?

4

3 に答える 3

25

IEEE 754 浮動小数点表現を想定すると、2 つの NaN 値が等しいかどうかを比較することはできません。NaN は、それ自体を含め、どの値とも等しくありません。ただし、ヘッダーstd::isnanから両方が NaN であるかどうかをテストできます。<cmath>

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

Pre-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 == xx の値が NaN の場合は false です。ソース

于 2013-03-07T10:38:53.663 に答える