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


110

これNaNをに、doubleまたはfloatC / C ++で割り当てることはできますか?JavaScriptのように:a = NaN。したがって、後で変数が数値かどうかを確認できます。


ここで私は別の手段によって生成されたときにどのように見えるか、様々なNaNを示していますstackoverflow.com/questions/18118408/...
チロSantilli郝海东冠状病六四事件法轮功

回答:


153

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

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

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


20
それとも、自分自身に番号を比較することができます- x == x戻りfalseIFF xはNaNです。
Archie

7
@Archie:どちらの言語でも保証されているとは思いません。
マイクシーモア

3
@MikeSeymour言語標準ではありませんが、コンパイラーがIEEEに準拠していると主張する場合は、私の知る限りこれでうまくいくはずです。
Pixelchemist 2013年

37
@Pixelchemist:確かに、難読化は必要だが移植性は必要ない場合のオプションです。個人的には、難読化せずに移植性を好むので、自分で提案することはしません。
マイクシーモア

9
マイナーな注意:NANは、floatではなく、doubleです。リンク
orion elenzil 2014

23

他の人があなたが探していると指摘したように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標準をサポートしていることを意味します。この前のスレッドは、これがほとんどの状況に当てはまることを説明しています


9

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

6
+1。ウィキペディアには、静かなNaNシグナルNaNに関する情報があります。
ドリューノークス2014年

1

これは、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)

異なる文字列の出力の違いは何ですか?一般的な数値コードでどちらを使用すればよいですか?
quant_dev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.