2013-01-05 10 views
8

Eventuali duplicati:
NaN Literal in C?Come definire il valore NaN in ANSI C?

Sto scrivendo una funzione in ANSI C che riceve due numeri come parametri. I parametri sono di tipo int o float. Il numero può o non può essere valido in base al mio filtro. Come posso restituire un valore che significa fallimento? Il tipo di reso è float. La prima cosa che mi è venuta in mente è stata il tipo astratto NaN. Ma io non so come rappresentare in ANSI C.

(dispiace per il mio cattivo inglese. L'inglese non è la mia lingua madre)

+0

@OliCharlesworth: Ma è C99 – Jack

+0

Una delle risposte suggerite '0.0/0.0'. –

+1

Non esiste un modo assolutamente portatile, NaN non esiste in C89 e non è obbligatorio da C99. – effeffe

risposta

12

NaN non è un "tipo astratto". È un valore di un dato a virgola mobile.

Se per "ANSI C" intendi di serie C (che è il significato reale del termine, in quanto ne ha uno), comprendono <math.h> e utilizzare la macro NAN per produrre un nan, e isnan(x) per rilevare una .

Se per "ANSI C" in realtà si intende lo standard lungo sostituito C89 (che alcune persone intendono, anche se non è formalmente corretto), si può produrre un valore NaN con 0./0., e verificare la presenza di uno con x != x .

+0

Puoi anche creare un piccolo wrapper nel tuo codice che rilevi se il codice non viene compilato come C99 o superiore e quindi definisce le macro 'NAN' e' isnan' rispetto a quelle della tua risposta. – Will

+0

@Will: certamente, anche se non penso che '0/0.'soddisfa formalmente i requisiti della macro' NAN' (vale a dire che dovrebbe essere utilizzabile per l'inizializzazione statica); tuttavia probabilmente non è una preoccupazione per la maggior parte degli utenti. –

+2

@StephenCanon '0./0' è un'espressione costante, quindi è OK per l'inizializzazione statica. – ouah

4

La questione il numero non può essere valido secondo la mia "filtrare poi come faccio a tornare un valore fallimento significa

Invece di confrontare il numero contro NaN è possibile utilizzare questo:?

if (x != x) // x is NaN 

come accennato nel c ommenti, è possibile utilizzare questa espressione 0.f/0.f per produrre un valore NaN float in C89.

+0

OP non ha chiesto come controllare NaN. –

-2

avere qualcosa di simile

if(your_variable != your_variable) 
{ 
    return 0; //catch 0 as the failure returned value 
} 
else 
{ 
    //your code 
} 
+0

-1 perché questa risposta non spiega nulla, pur contenendo codice che sarebbe molto confuso per chiunque non sia già a conoscenza su come utilizzare NaN e in grado di individuarlo immediatamente. Anche perché '0' può essere un valore di ritorno perfettamente ragionevole. –

2

Non si può fare questo, è necessario due variabili restituite, uno per il valore, uno per l'indicatore di guasto.

Ad esempio, è possibile impostare la funzione in modo che la funzione restituisca true in caso di funzionamento normale. false in caso di errore (NaN).

La variabile che memorizza il risultato viene passata per riferimento come parametro e terrà il valore restituito in caso di successo.

BOOL myFunction(int inInt, float inFloat, float *outResult) 
{ 
    /* 
     PROCESSING HERE 
    */ 

    // in case of failure 

    if(/* failure condition here */) 
    { 
     *outResult = 0; 
     return false; 
    } 

    *outResult = /* your result */ 

    return true; 
} 


// how to use the function 

int a; 
float b; 
float result; 
BOOL success; 

success = myFunction(a, b, &result); 

if(success) 
{ 
    // do whatever with your "result" 
} 
else 
{ 
    // NaN 
}