formato - imprimir float en c
¿Cómo distingue printf y co entre float y double? (1)
No se diferencia. No es posible recibir un float
como vararg: cualquier argumento de float
que proporcione primero se promueve a double
.
6.5.2.2/6 define "promociones de argumentos predeterminados", y / 7 indica que las promociones de argumentos predeterminados se aplican a "argumentos finales", es decir, varargs denotado por ...
¿Cómo funciona para scanfs / sscanf?
El formato %f
para scanf
requiere un puntero para float
. %lf
requiere un puntero para double
, %Lf
requiere un puntero para long double
.
copiando el valor a una temperatura y casting (¿es esto correcto?)
Si proporciona un argumento flotante, la implementación crea un temporal de tipo doble, lo inicializa con el valor flotante y lo pasa como vararg. La conversión por definición es una conversión explícita por el uso del operador de conversión: puede realizar la conversión si lo desea para que el lector pueda ver con claridad lo que está pasando, pero float f = 3; printf("%f", f);
float f = 3; printf("%f", f);
es exactamente lo mismo que float f = 3; printf("%f", (double)f);
float f = 3; printf("%f", (double)f);
. La promoción de argumentos predeterminada tiene el mismo significado que la conversión.
Dado que no está muy tipeado, pensé que solo había elegido el tamaño de memoria correcto y lo había interpretado según el tipo de argumento. Pero flotar y doblar usan% f y son de diferentes tamaños.
PS Puedo ver cómo podría funcionar la promoción a través de la copia del valor a un temp y casting (¿está bien?) Pero, ¿cómo funciona para scanfs / sscanf?