Costante NaN C / C ++ (letterale)?


Risposte:


153

In C, NANè dichiarato in <math.h>.

In C ++, std::numeric_limits<double>::quiet_NaN()è dichiarato in <limits>.

Ma per verificare se un valore è NaN, non è possibile confrontarlo con un altro valore NaN. Utilizzare invece isnan()da <math.h>in C o std::isnan()da <cmath>in C ++.


20
Oppure puoi confrontare il numero con se stesso - x == xrestituisce falsese xe solo se è NaN.
Archie

7
@Archie: non credo sia garantito in nessuna delle due lingue.
Mike Seymour

3
@MikeSeymour Non per lo standard del linguaggio, ma per quanto ne so dovrebbe funzionare se il compilatore dichiara di essere conforme a IEEE.
Pixelchemist

37
@ Pixelchemist: in effetti, è un'opzione se hai bisogno di offuscamento ma non di portabilità. Personalmente, preferisco la portabilità senza offuscamento, quindi non lo suggerirò da solo.
Mike Seymour

9
nota minore: NAN è un float, non un double. link
orion elenzil

23

Come altri hanno sottolineato che stai cercando std::numeric_limits<double>::quiet_NaN()anche se devo dire che preferisco i documenti cppreference.com . Soprattutto perché questa affermazione è un po 'vaga:

Significativo solo se std :: numeric_limits :: has_quiet_NaN == true.

ed è stato semplice capire cosa significa su questo sito, se controlli la loro sezione su di std::numeric_limits::has_quiet_NaNesso dice:

Questa costante è significativa per tutti i tipi a virgola mobile ed è garantita essere vera se std :: numeric_limits :: is_iec559 == true.

che, come spiegato qui se truesignifica che la vostra piattaforma supporta IEEE 754standard. Questo thread precedente spiega che questo dovrebbe essere vero per la maggior parte delle situazioni.


9

Questo può essere fatto usando numeric_limits in C ++:

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

Questi sono i metodi che probabilmente vorrai esaminare:

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 ha alcune informazioni sul NaN silenzioso e sui segnali NaN .
Drew Noakes

1

È possibile assegnare un NaN a un double o un float in C ...?

Sì, poiché C99, (C ++ 11) <math.h>offre le seguenti funzioni:

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

che sono come le loro strtod("NAN(n-char-sequence)",0)controparti e NANper gli incarichi.

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

Output di esempio: (dipendente dall'implementazione)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)

1
Quali sono le differenze tra le uscite per stringhe diverse? Quale dovremmo usare nel tipico codice numerico?
quant_dev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.