2009-05-08 15 views
11

Recientemente, a veces (rara vez) cuando exportamos datos desde nuestra aplicación, el registro de exportación contiene valores flotantes que se ven como "-1. # J". No he podido reproducirlo, así que no sé cómo se ve el elemento flotante en formato binario o cómo lo muestra Visual Studio.¿Qué significa error de coma flotante -1. # J?

Traté de ver el código fuente de printf, pero no encontré nada (aunque no estoy seguro al 100% de que miré la versión correcta ...).

He intentado googlear pero google arroja cualquier #, parece. Y no puedo encontrar ninguna lista de errores flotantes.

+0

Ver también: http://stackoverflow.com/questions/5541975/what-does-1-mean/5542066#5542066 –

Respuesta

27

Puede ser infinito negativo o NaN (no es un número). Debido al formato en el campo, printf no diferencia entre ellos.

He probado el siguiente código en 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 

que se traduce en la siguiente salida:

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

eliminar el especificador de formato 0.3 da:

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

así que está claro 0/0 da NaN y -1/0 da negativo infinito (NaN, -inf y + inf son los únicos "er roneous "números de punto flotante, si no recuerdo mal")

+0

Interesante ... Me pregunto por qué termina con una 'J' al truncar los indicadores de infinito/NaN? –

+14

La J es el resultado de redondear los "dígitos" IN a un lugar menos. – RBerteig

+3

La traducción de NaN e INF a un código con un dígito inicial y un punto es un gran error en mi humilde opinión. Es demasiado fácil terminar con un campo numérico en un archivo de texto que se puede volver a leer (con un analizador imperfecto pero plausible, sin duda) como el valor +1 o -1, que es bastante diferente del valor que se imprimió. Sería mucho mejor escribirlo como + # INF, - # INF, y así sucesivamente. – RBerteig

Cuestiones relacionadas