2013-05-22 18 views

risposta

95

In C, NAN è dichiarata 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++.

+16

Oppure puoi confrontare il numero con se stesso - 'x == x' restituisce' falso' iff 'x' è NaN. – Archie

+6

@Archie: Non penso che sia garantito in entrambe le lingue. –

+3

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

7

questo può essere fatto utilizzando i numeric_limits in C++:

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

Questi sono i metodi che probabilmente vuole guardare:

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. 
+4

+1. Wikipedia ha alcune informazioni su [quiet NaN] (http://en.wikipedia.org/wiki/NaN#Quiet_NaN) e [segnalando NaN] (http://en.wikipedia.org/wiki/NaN#Signaling_NaN). –

18

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

Solo significativo se std :: numeric_limits :: has_quiet_NaN == true.

ed è stato semplice per capire cosa questo significa in questo sito, se si controlla la loro sezione std::numeric_limits::has_quiet_NaN si dice:

Questa costante è significativo per tutti i tipi a virgola mobile ed è garantito per essere vero se std :: numeric_limits :: is_iec559 == true.

che, come ha spiegato here se true significa che la vostra piattaforma supporta IEEE 754 standard. Questo previous thread spiega questo dovrebbe essere vero per la maggior parte delle situazioni.

-11

Generalmente, non è una buona idea avere numeri non validi nel programma. Può essere molto difficile sbarazzarsi di loro più tardi e possono causare il crash del programma.

Ecco una buona lista di modi per catturare tali numeri senza assegnare a loro: https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing-errors

In breve, ci sono tre:

  • confronto
  • utilizzando C++ 11 di serie
  • utilizzando parole di controllo _controlfp e _control87
+1

NaN è un numero perfettamente buono da avere (a volte non sono necessarie eccezioni) –