Cosa significa errore in virgola mobile -1.#J?

Cosa significa errore in virgola mobile -1.#J?


Di recente, a volte (raramente) quando esportiamo i dati dalla nostra applicazione, il registro di esportazione contiene valori float che assomigliano a "-1.#J". Non sono stato in grado di riprodurlo, quindi non so che aspetto abbia il float in binario o come lo visualizzi Visual Studio.


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


Ho provato a cercare su google ma google butta via qualsiasi #, a quanto pare. E non riesco a trovare alcun elenco di errori float.


Risposte:


Può essere infinito negativo o NaN (non un numero). A causa della formattazione sul campo printf non li differenzia.


Ho provato il codice seguente 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 nel seguente output:


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

rimuovendo l'identificatore di formattazione .3 si ottiene:


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

quindi è chiaro che 0/0 dà NaN e -1/0 dà infinito negativo (NaN, -inf e +inf sono gli unici numeri in virgola mobile "errati", se ricordo bene)


Alcune risposte al codice


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