2009-05-08 17 views
11

Recentemente, a volte (raramente) quando esportiamo i dati dalla nostra applicazione, il registro di esportazione contiene valori float simili a "-1. # J". Non sono stato in grado di riprodurlo quindi non so come appare il float in binario o come Visual Studio lo visualizza.Cosa vuol dire errore in virgola mobile -1. # J?

Ho provato a guardare il codice sorgente per printf, ma non ho trovato nulla (non sicuro al 100% ho guardato la versione giusta però ...).

Ho provato su google, ma Google getta via qualsiasi #, sembra. E non riesco a trovare nessun elenco di errori float.

+0

Vedi anche: http://stackoverflow.com/questions/5541975/what-does-1-mean/5542066#5542066 –

risposta

27

Può essere infinito negativo o NaN (non un numero). A causa della formattazione sul campo printf non fa differenza tra loro.

ho provato il seguente codice in Visual Studio 2008:

double a = 0.0; 
printf("%.3g\n", 1.0/a); // +inf 
printf("%.3g\n", -1.0/a); // -inf 
printf("%.3g\n", a/a); // NaN 

che si traduce nella seguente output:

1.#J 
-1.#J 
-1.#J 

rimuovere l'identificatore di formattazione .3 dà:

1.#INF 
-1.#INF 
-1.#IND 

quindi è chiaro che 0/0 dà NaN e -1/0 dà infinito negativo (NaN, -inf e + inf sono l'unico "er "numeri virgola mobile", se non ricordo male)

+0

Interessante ... Mi chiedo perché finisce con una "J" quando troncando gli indicatori infinito/NaN? –

+14

La J è il risultato dell'arrotondamento delle "cifre" in un posto in meno. – RBerteig

+3

La traduzione di NaN e INF in un codice con una cifra iniziale e un punto è un IMHO un errore grossolano. È fin troppo facile finire con un campo numerico in un file di testo che può essere riletto (con un parser imperfetto ma plausibile, ammettiamolo) come il valore +1 o -1 che è piuttosto diverso dal valore che è stato stampato. Sarebbe molto meglio scriverlo come + # INF, - # INF, e così via. – RBerteig