回答:
Cでは、NAN
で宣言されてい<math.h>
ます。
C ++では、std::numeric_limits<double>::quiet_NaN()
で宣言されてい<limits>
ます。
ただし、値がNaNかどうかを確認するために、別のNaN値と比較することはできません。代わりに、CまたはC ++ から使用isnan()
します。<math.h>
std::isnan()
<cmath>
x == x
戻りfalse
IFF x
はNaNです。
他の人があなたが探していると指摘したようにstd::numeric_limits<double>::quiet_NaN()
、私はcppreference.comドキュメントを好むと言わざるを得ません。特にこのステートメントは少しあいまいなので、
std :: numeric_limits :: has_quiet_NaN == trueの場合にのみ意味があります。
そして、あなたがstd::numeric_limits::has_quiet_NaN
それについて彼らのセクションをチェックすれば、これがこのサイトで何を意味するのかを理解するのは簡単でした:
この定数はすべての浮動小数点型で意味があり、std :: numeric_limits :: is_iec559 == trueの場合はtrueであることが保証されています。
ここで説明するようにtrue
、プラットフォームがIEEE 754
標準をサポートしていることを意味します。この前のスレッドは、これがほとんどの状況に当てはまることを説明しています。
これは、C ++のnumeric_limitsを使用して行うことができます。
http://www.cplusplus.com/reference/limits/numeric_limits/
これらはおそらくあなたが見たいメソッドです:
infinity() T Representation of positive infinity, if available.
quiet_NaN() T Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T Representation of signaling "Not-a-Number", if available.
これは、NaNをCのdoubleまたはfloatに割り当てることは可能ですか?
はい、C99以降、(C ++ 11)<math.h>
は以下の機能を提供します:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
これは、strtod("NAN(n-char-sequence)",0)
対応するものやNAN
割り当て用のものです。
// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
出力例:(実装に依存)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)