2011-09-05 12 views
21

Qualcuno dovrebbe conoscere il metodo per verificare se un doppio (o un intero) è infinito, ad esempio quando viene eseguita l'operazione 1/0?Controlla per inf - obiettivo c

isfinite (n) non sembra funzionare.

+7

Un numero intero non può essere infinito. –

+0

Potresti testare 'x * 2 == x && x! = 0' o qualcosa del genere ... Per NaN puoi testare' x! = X'. –

+2

Puoi chiarire cosa intendi con "' isfinite() 'non sembra funzionare."? –

risposta

36

Check

if(d == INFINITY) {} 

o

if(d > DBL_MAX) {} 

INFINITY è un'espressione decimale costante definita math.h rappresenta l'infinito positivo;
DBL_MAX è una costante definita in float.h che rappresenta il doppio più grande che può essere rappresentato.

Verifica anche here

+0

Probabilmente dovresti descrivere da dove vengono questi simboli per questa risposta. –

+0

if (d == INFINITY) funziona bene, grazie – John67

+1

@Kerrek SB: aggiunte informazioni mancanti – Saphrosit

17

<math.h> ha una macro, isinf, definito per controllare la dimensione del suo argomento e quindi chiamare la funzione appropriata __isinf al tipo:

#define isinf(x) \ 
     ( sizeof (x) == sizeof(float) ? __isinff((float)(x)) \ 
     : sizeof (x) == sizeof(double) ? __isinfd((double)(x)) \ 
              : __isinf ((long double)(x))) 

La macro è lo stesso in architecture/i386/math.h e architecture/arm/math.h; le implementazioni delle funzioni stesse presumibilmente differiscono.

Ciò restituirà vero per infinito negativo così come positiva, se vi capita di incontrare una cosa del genere:

2011-10-26 18: 41: 53,424 ToInfinityEtc [30197: 903] Si Certamente!
2011-10-26 18: 41: 53.426 ToInfinityEtc [30197: 903] Scommetto!

+0

ma isinf è solo per il compilatore GNU. non compatibile con llvm. xcode dice "uso dell'identificatore undeclerated isinf" anche se flag + click naviga in cmath. Ho importato math.h manualmente. ma continua a navigare in cmath e yes non può compilare a causa di questo errore "uso di identificatore non cifrato isinf". alla fine ho sostituito std :: isinf invece di isinf ora compilato. –

+1

math.h e 'isinf()' [fanno entrambi parte dello standard POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/math.h.html), @N.Ramos. Non hanno nulla a che fare con GCC. Hai un altro problema da qualche parte. –