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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top