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?