2009-05-08 7 views
11

Récemment, parfois (rarement) lorsque nous exportons des données de notre application, le journal d'exportation contient des valeurs flottantes qui ressemblent à "-1. # J". Je n'ai pas pu le reproduire, donc je ne sais pas à quoi ressemble le float en binaire, ou comment Visual Studio l'affiche.Que signifie l'erreur de virgule flottante -1. # J?

J'ai essayé de regarder le code source de printf, mais je n'ai rien trouvé (pas sûr à 100% que j'ai regardé la bonne version ...).

J'ai essayé la recherche de google, mais google jette un #, semble-t-il. Et je ne trouve aucune liste d'erreurs flottantes.

+0

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

Répondre

27

Il peut s'agir de l'infini négatif ou de NaN (pas un nombre). En raison du formatage sur le terrain, printf ne les différencie pas.

J'ai essayé le code suivant dans 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 

qui se traduit par la sortie suivante:

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

enlever le formatage .3 spécificateur donne:

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

il est donc clair que 0/0 donne NaN et -1/0 donne l'infini négatif (NaN, -inf et + inf sont les seuls "virgule flottante", si je me souviens bien)

+0

Intéressant ... Je me demande pourquoi ça se termine avec un 'J' en tronquant les indicateurs infinity/NaN? –

+14

Le J est le résultat de l'arrondissement des "chiffres" IN à un endroit en moins. – RBerteig

+3

La traduction de NaN et INF en un code avec un chiffre principal et un point est un IMHO une erreur grossière. Il est bien trop facile de se retrouver avec un champ numérique dans un fichier texte qui peut être relu (avec un analyseur imparfait mais plausible, certes) comme la valeur +1 ou -1 qui est plutôt différente de la valeur qui a été imprimée. Il serait préférable de l'écrire en tant que + # INF, - # INF, et ainsi de suite. – RBerteig