2015-05-06 14 views
6

Oltre alla macro NAN, C99 ha due modi per generare un valore NaN per un numero in virgola mobile, la funzione nanf(const char *tagp) e strtof("NAN(char-sequence)").Per che cosa è l'argomento "sequenza-carattere" per le funzioni di generazione NaN?

Entrambi questi metodi di generazione di un NaN accettano un argomento stringa facoltativo (* tagp in nanf() e la sequenza di caratteri nel metodo strtof). Che cosa fa esattamente questo argomento per le stringhe? Non sono stato in grado di trovare esempi concreti di come lo useresti. Da cppreference.com abbiamo:

La chiamata nan ("stringa") è equivalente al strtod chiamata ("NAN (string)", (char **) NULL);

La chiamata nan ("") è equivalente alla chiamata strtod ("NAN()", (char **) NULL);

La chiamata nan (NULL) è equivalente alla chiamata strtod ("NAN", (char **) NULL);

E nan(3) dice:

Queste funzioni restituiscono una rappresentazione (determinato dal TAGP) di un NaN tranquilla. [snip] L'argomento tagp è usato in un modo non specificato. Sui sistemi IEEE 754, ci sono molte rappresentazioni di NaN, e tagp ne seleziona uno.

Questo in realtà non mi dice cosa posso usare per la stringa di tagp o perché vorrei mai usarlo. Esiste un elenco di opzioni valide per questa stringa di tag e quale sarebbe il motivo per utilizzarne uno rispetto al valore predefinito nanf(NULL)?

+0

La pagina cppreference si è collegato ha un esempio concreto – Cubbi

+0

Wow. Come mi sono perso. Anche se non sono ancora sicuro quale sia la differenza tra le due rappresentazioni nell'esempio. – mshildt

risposta

7

Tl; Dr: tagp argomento ti dà la possibilità di avere diversi valori NAN.

Questa è la pagina man per nan (3) che fornisce un po 'più di informazioni su tagp.

Principalmente:

Le funzioni nan() restituiscono un tranquillo NaN, il cui campo di frazione trascinamento contiene il risultato della conversione TAGP ad un intero senza segno.

questo ti dà la possibilità di avere diversi valori NAN.

particolare dal C99 Rationale doc:

Altre applicazioni di NaN possono essere utili.Le parti disponibili dei NaN sono state utilizzate per codificare informazioni ausiliarie, ad esempio sull'origine del NaN . I NaN di segnalazione potrebbero essere candidati per il riempimento della memoria non inizializzata ; e le loro parti disponibili potrebbero distinguere gli oggetti mobili non inizializzati . Segnalazione IEC 60559 I gestori di NaNs e trap potenzialmente forniscono ganci per la manutenzione delle informazioni diagnostiche o per l'implementazione di aritmetica speciale.

Esiste un'implementazione here. Intendiamoci, questo può essere o non essere conforme allo standard, come notato nei commenti. Tuttavia, dovrebbe darti un'idea di cosa è usato per tagp.

Come nella pagina man, si può vedere la sostituzione di cui sopra:

nan("1") = nan (7ff8000000000001) 
nan("2") = nan (7ff8000000000002) 

pagina man completa qui:

NAN (3) Funzioni BSD libreria manuale
NAN (3)

NOME nan - generare un NaN silenzioso

RIEPILOGO #include

double 
nan(const char *tagp); 

long double 
nanl(const char *tagp); 

float 
nanf(const char *tagp); 

DESCRIZIONE Le funzioni nan() restituisce un tranquillo NaN, il cui campo di frazione trascinamento contiene il risultato della conversione TAGP ad un intero senza segno. Se tagp è troppo grande per essere contenuto nel campo della frazione finale del NaN , vengono utilizzati i bit meno significativi del numero intero rappresentato da tagp.

VALORI PARTICOLARI Se TAGP contiene caratteri non numerici, la funzione restituisce un NaN whos campo di frazione di trascinamento è zero.

Se tagp è vuoto, la funzione restituisce un campo di frazione trascinamento whis che è zero.

STANDARD Le funzioni nan() sono conformi a ISO/IEC 9899: 2011.

BSD 1 lug 2008

+3

È importante notare che nessuno standard specifica come 'tagp' debba essere convertito nel payload di un NaN. Gli standard sono deliberatamente vaghi su questo punto per consentire alle implementazioni la libertà di fare cose come la memorizzazione di un hash di una spiegazione in linguaggio naturale di ciò che ha causato il NaN nel carico utile. La stragrande maggioranza delle implementazioni o ignora semplicemente l'argomento 'tagp' o lo interpreta come un intero, ma non dovresti supporre che sia così. –

+0

Buon punto @StephenCanon, grazie! – bentank

3

Questo in realtà non mi dice cosa posso usare per la stringa di tagp o perché vorrei mai usarlo.

Alcuni standard in virgola mobile, ad es. IEEE-754, hanno più valori NaN diversi. Questa specifica della funzione nan consente a un'implementazione di selezionare una specifica rappresentazione NaN in base alla stringa in un modo che potrebbe essere specificato dall'implementazione.