2012-10-10 55 views
9

La descripción del tipo float en C menciona que el número de dígitos significativos es 6. Sin embargo,Número de dígitos significativos para un tipo de punto flotante

float f = 12345.6; 

y luego imprimirlo usando printf() no imprime 12345.6, imprime 12345.599609. Entonces, ¿qué significa "6 dígitos significativos" (o "15 en el caso de un double") para un tipo de coma flotante?

+8

Tenga en cuenta que los tipos de punto flotante no se almacenan en la base 10, por lo que el número de dígitos * decimales significantes es necesariamente una aproximación. –

+2

En realidad, hay 8 bits para exp y 23 bits para frac. – halfelf

Respuesta

10

De acuerdo con standard, no todos los números decimales pueden almacenarse exactamente en la memoria. Dependiendo del tamaño de la representación, el error puede llegar a un cierto máximo. Para float esto es 0.0001% (6 dígitos significativos = 10^-6 = 10^-4 %).

En su caso, el error es (12345.6 - 12345.599609)/12345.6 = 3.16e-08 mucho menor que el error máximo de los flotadores.

16

6 dígitos significativos significa que el error máximo es de aproximadamente +/- 0.0001%. El valor de flotante único en realidad tiene aproximadamente 7,2 dígitos de precisión (source). Esto significa que el error es aproximadamente +/- 12345.6/10^7 = 0.0. Que está en el orden de tu error (0.000391).

0

El problema aquí es que no se puede asegurar que un número se pueda almacenar en un flotador. Debe representar este número con mantisa, base y exponente como se explica en IEEE 754. El número printf(...) muestra que es el número flotante real que se almacenó. No puede asegurar una cantidad de dígitos significativos en un número flotante.

7

Lo que están viendo no es realmente ningún problema con cifras significativas, pero el hecho de que los números en un ordenador se almacenan en el sistema binario, y no hay representación binaria finita de 3/5 (= 0,6). 3/5 en binario se ve como 0.100110011001 ..., con el patrón "1001" repitiéndose para siempre. Esta secuencia es equivalente a 0.599999 ... repetición. En realidad, está llegando a tres lugares decimales a la derecha del punto decimal antes de que se produzca cualquier error relacionado con la precisión.

Esto es similar a cómo no hay representación de base-10 finita de 1/3; tenemos 0.3333 repitiendo para siempre

Cuestiones relacionadas