コード領域が NAN 値を生成するアプリケーションがあります。等しいかどうかの値を比較し、それに基づいて残りのコードを実行する必要があります。C++ で 2 つの NAN 値を等しいかどうか比較する方法は?
3 に答える
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 であることを知っていると仮定して、いくつかのビット チェックを行うことです。明らかに、これは最も移植性の高いオプションではありません。
Pre-C++11 に関しては、それにも後押しがあります。
#include <boost/math/special_functions/fpclassify.hpp>
template <class T>
bool isnan(T t); // NaN.
与えられた NaN は何とも等しくなく、他の NaN と等しくなることはないため、それらを相互に比較することは無駄な作業です。
GNU ドキュメントから:
NaN は順序付けされていません。それ自体を含め、どのようなものよりも大きくも小さくもありません。
x == x
x の値が NaN の場合は false です。ソース