Confusión con los números de punto flotante
-
27-09-2019 - |
Pregunta
int main()
{
float x=3.4e2;
printf("%f",x);
return 0;
}
Salida:
340.000000 // It's ok.
Pero si x=3.1234e2
escribir el resultado es 312.339996
y si la salida es x=3.12345678e2
312.345673
.
¿Por qué son las salidas como estas? Creo que si escribo x=3.1234e2
la salida debe ser 312.340000
, pero la salida real es 312.339996
usando el compilador GCC.
Solución
No todos los números fraccionarios tienen un equivalente exacto binaria por lo que se redondea al valor más cercano.
ejemplo simplificado,
Si usted tiene 3 bits para la fracción, puede tener:
0
0.125
0.25
0.375
...
0.5 tiene una representación exacta, pero 0.1 se mostrará como 0,125.
Por supuesto, las diferencias reales son mucho más pequeñas.
Otros consejos
números de coma flotante son normalmente representados como fracciones veces binarios una potencia de dos, para la eficiencia. Esta es tan preciso como base 10 representación, excepto que no son fracciones decimales que no se pueden representar exactamente como fracciones binarias. Ellos son, en cambio, representados como aproximaciones.
Además, un float
es normalmente 32 bits de largo, lo que significa que no tiene todo lo que muchos dígitos significativos. Se puede ver en sus ejemplos que son una precisión de unos 8 dígitos significativos.
Usted es, sin embargo, la impresión de los números a un poco más allá de su significado, y por lo tanto se está viendo la diferencia. Vistazo a su printf
documentación de cadena de formato para ver cómo imprimir menos dígitos.
Es posible que necesite para representar números decimales con exactitud; esto ocurre a menudo en aplicaciones financieras. En ese caso, es necesario utilizar una biblioteca especial para representar números, o simplemente calcular todo como enteros (como representación de cantidades como centavos en lugar de dólares y como fracciones de dólar).
La referencia estándar es Lo que todo informático debe saber acerca de Punto Flotante Aritmética-, pero parece que sería muy avanzada para usted. Alternativamente, usted podría formatos de punto flotante de Google (en particular los formatos estándar IEEE) o mirar hacia arriba en la Wikipedia, si desea los detalles.