Controllo sui nan in C
Ciao a tutti.
Mi servirebbe un comando del genere da inserire in un programma in C:
In pratica mi serve perché se un calcolo non va a buon fine, lo ripeto cambiando qualche impostazione.
Per come l'ho scritto sembra però che non vada bene, e me lo aspettavo anche:
error: invalid operands to binary == (have ‘double’ and ‘double (*)(const char *)’)
C'è un modo per scrivere una cosa del genere? (magari che oltre al nan includa anche l' inf)
Ovviamente l'alternativa è risalire alla causa che ha prodotto il nan, ma siccome nel caso in questione, le cause possono essere diverse, preferivo usare una cosa del genere per sbrigarmi.
Mi servirebbe un comando del genere da inserire in un programma in C:
if(x == nan) { ....; goto again; }
In pratica mi serve perché se un calcolo non va a buon fine, lo ripeto cambiando qualche impostazione.
Per come l'ho scritto sembra però che non vada bene, e me lo aspettavo anche:
error: invalid operands to binary == (have ‘double’ and ‘double (*)(const char *)’)
C'è un modo per scrivere una cosa del genere? (magari che oltre al nan includa anche l' inf)
Ovviamente l'alternativa è risalire alla causa che ha prodotto il nan, ma siccome nel caso in questione, le cause possono essere diverse, preferivo usare una cosa del genere per sbrigarmi.
Risposte
Ma l'errore non sembra avere alcun legame con quello che stai chiedendo.. L'errore dice abbastanza chiaramente che non sa come confrontare un valore double con un puntatore a una funzione che restituisce un double a partire da una stringa.. Sei certo che l'errore sia quello che immagini? NaN è un valore perfettamente valido per un double ed è quindi utilizzabile per un confronto..
In ogni caso, un metodo facile per verificare che un valore x sia NaN è verificare che x == x restituisca 0..
In ogni caso, un metodo facile per verificare che un valore x sia NaN è verificare che x == x restituisca 0..
Le uniche aggiunte fatte rispetto a un programma funzionante erano quel' x == nan e il goto.
Quindi l'unica possibilità era che l'errore fosse proprio dovuto a quello. Ho provato a scrivere in diversi formati: nan, NaN, Nan.
Non è cambiato nulla.
Consultando un po' il web, e vedendo che alcuni hanno usato con successo questa stringa, ho pensato che probabilmente è accettabile in C++ ma non in C.
In ogni caso ho trovato che un modo di ottenere questo risultato (considerando sia il caso inf sia il nan) è:
Quindi l'unica possibilità era che l'errore fosse proprio dovuto a quello. Ho provato a scrivere in diversi formati: nan, NaN, Nan.
Non è cambiato nulla.
Consultando un po' il web, e vedendo che alcuni hanno usato con successo questa stringa, ho pensato che probabilmente è accettabile in C++ ma non in C.
In ogni caso ho trovato che un modo di ottenere questo risultato (considerando sia il caso inf sia il nan) è:
if(isnan(x) || isinf(x)) { ....; goto again; }
Se non ricordo male basta usare un confronto del tipo
Sono sicuro che boost (c++) possiede una funzione ma non sono sicuro esista una funzione standard per farlo (mentre molti compilatori estendono il C con macro e simili).
if(x != x) { }
Sono sicuro che boost (c++) possiede una funzione ma non sono sicuro esista una funzione standard per farlo (mentre molti compilatori estendono il C con macro e simili).