C / C ++ NaN sabiti (değişmez)?


110

Bu bir atamak mümkün mü NaNbir etmek doubleveya floatC / C ++? JavaScript gibi yapmanız: a = NaN. Böylece daha sonra değişkenin sayı olup olmadığını kontrol edebilirsiniz.


Burada çeşitli
NaN'lerin

Yanıtlar:


153

C'de NANbeyan edilir<math.h> .

C ++ ' std::numeric_limits<double>::quiet_NaN()da <limits>.

Ancak bir değerin NaN olup olmadığını kontrol etmek için onu başka bir NaN değeriyle karşılaştıramazsınız. Bunun yerine kullanmak isnan()gelen <math.h>veya C std::isnan()den <cmath>C ++.


20
- Ya da kendisine numarayı karşılaştırabilirsiniz x == xdöner falseIFF xNaN olur.
Archie

7
@Archie: Bunun her iki dilde de garanti olduğunu sanmıyorum.
Mike Seymour

3
@MikeSeymour Değil dil standardında ama bildiğim kadarıyla o gereken derleyici iddialar IEEE uyumlu olması halinde çalışır.
Pixelchemist

39
@Pixelchemist: Gerçekten, gizlemeye ihtiyacınız varsa ancak taşınabilirliğe ihtiyacınız varsa bu bir seçenek. Şahsen ben şaşırtmasız taşınabilirliği tercih ederim, bu yüzden kendim önermeyeceğim.
Mike Seymour

9
küçük not: NAN bir çift değil, bir yüzerdir. bağlantı
orion elenzil

23

Diğerlerinin de belirttiği gibi std::numeric_limits<double>::quiet_NaN(), cppreference.com belgelerini tercih ettiğimi söylemem gerekse de aradığınızı söylediler . Özellikle bu ifade biraz belirsiz olduğu için:

Sadece std :: numeric_limits :: has_quiet_NaN == true ise anlamlıdır.

ve bu sitede bunun ne anlama geldiğini anlamak basitti, eğer sitedeki bölümlerine bakarsanız std::numeric_limits::has_quiet_NaN:

Bu sabit tüm kayan nokta türleri için anlamlıdır ve eğer std :: numeric_limits :: is_iec559 == true ise doğru olduğu garanti edilir.

hangi olarak açıklanabilir burada eğer truevasıtasıyla, platform destekleyen IEEE 754standart. Bu önceki ileti dizisi , bunun çoğu durum için doğru olması gerektiğini açıklıyor.


9

Bu, C ++ 'daki numeric_limits kullanılarak yapılabilir:

http://www.cplusplus.com/reference/limits/numeric_limits/

Muhtemelen bakmak isteyeceğiniz yöntemler şunlardır:

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. Wikipedia'da sessiz NaN ve sinyal verme NaN hakkında bazı bilgiler var .
Drew Noakes

1

Bu, C ... 'deki double veya float'a bir NaN atamak mümkün müdür?

Evet, C99 olduğundan (C ++ 11) <math.h>aşağıdaki işlevleri sunar:

#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)meslektaşları gibi ve NANgörevler için.

// 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);

Örnek çıktı: (Uygulamaya bağlı)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)

1
Farklı dizeler için çıktılar arasındaki farklar nelerdir? Tipik sayısal kodda hangisini kullanmalıyız?
quant_dev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.