Considere el siguiente fragmento de código:¿Cómo manejan printf y scanf los formatos de precisión de coma flotante?
float val1 = 214.20;
double val2 = 214.20;
printf("float : %f, %4.6f, %4.2f \n", val1, val1, val1);
printf("double: %f, %4.6f, %4.2f \n", val2, val2, val2);
que da salida:
float : 214.199997, 214.199997, 214.20 | <- the correct value I wanted
double: 214.200000, 214.200000, 214.20 |
entiendo que 214.20
tiene una representación binaria infinita. Los dos primeros elementos de la primera línea tienen una aproximación del valor previsto, pero el último parece tener ninguna aproximación en absoluto, y esto me llevó a la siguiente pregunta:
Cómo hacer el scanf
, fscanf
, printf
, fprintf
(etc.) funciones tratan los formatos de precisión?
Sin precisión proporcionada, printf
imprimió un valor aproximado, pero con %4.2f
dio el resultado correcto. ¿Puede explicarme el algoritmo utilizado por estas funciones para manejar la precisión?
Gracias por responder, aunque mi pregunta todavía está en el mismo lugar. En primer lugar, el flotador NO podría contener el valor exacto de 214.20, entonces, ¿cómo podría recuperarlo SÓLO con precisión de% 4.2f y NO con% 4.6f? ¿Qué hizo para recuperar el valor? Entiendo que la aproximación está hecha, pero ¿CUÁL FUE EL PATRÓN UTILIZADO QUE CAUSADO INTERNO ALMACENADO 214.199997 PARA CONVERTIRSE EN 214.20 Y CÓMO LLEGAMOS A ESO? –
No estoy seguro de que te entiendo, pero eso es solo el [redondeo] (http://en.wikipedia.org/wiki/Rounding). Es pura casualidad que '% 4.2f' te brinde exactamente el valor que deseas. Todavía está "mal" ya que la representación binaria es * no * equivalente a 214.20 pero a 214.1999969482421875. Ahora, si redondeas "214.1999969482421875" a 6 dígitos, obtienes "214.199997" porque el séptimo dígito es un 9, convirtiendo el 6 en un 7. Pero cuando solo redondeas a 2 dígitos, obtienes "214.20" porque el tercer dígito es un nueve, por lo que necesita aumentar el 9 en el segundo dígito. Eso "desborda" a 10, convirtiendo el ".19" en ".20". – DarkDust
¡¡Oh !! Creo que está tratando de decir que esta operación se realiza en representación decimal, y así se formó 214.199997 como un efecto redondo de doble precisión. Porque si hubiera estado en representación binaria ya hemos confirmado que 214.20 NO es representable en binario, con todas las habilidades de redondeo utilizadas. –