web-dev-qa-db-ja.com

C / C ++ NaN定数(リテラル)?

C/C++でNaNdoubleまたはfloatに割り当てることは可能ですか? JavaScriptのように:a = NaN。そのため、後で変数が数値かどうかを確認できます。

100
exebook

Cでは、NAN<math.h>で宣言されます。

C++では、std::numeric_limits<double>::quiet_NaN()<limits>で宣言されます。

ただし、値がNaNであるかどうかを確認するために、別のNaN値と比較することはできません。代わりに、Cの<math.h>からisnan()を使用するか、C++の<cmath>からstd::isnan()を使用します。

139
Mike Seymour

他の人が指摘しているように、あなたは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になることが保証されています。

説明したように here if trueは、プラットフォームがIEEE 754標準をサポートしていることを意味します。この 前のスレッド は、これがほとんどの状況に当てはまることを説明しています。

22
Shafik Yaghmour

これは、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.
9
languitar