Corregir el especificador de formato para el doble en printf

¿Cuál es el especificador de formato correcto para double en printf? ¿Es %f o es %lf? Creo que es %f, pero no estoy seguro.

Ejemplo de código

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}
Solución

"%f"es el (o al menos un) formato correcto para un double. No hay ningún formato para unfloat, porque si intenta pasar unfloataprintf, será promovido adoubleantes de queprintf` lo reciba1. La norma actual también acepta la expresión "%lf": se especifica que la "l" no tiene efecto si va seguida del especificador de conversión "f" (entre otros).

Tenga en cuenta que este es un punto en el que las cadenas de formato printf difieren sustancialmente de las cadenas de formato scanf (y fscanf, etc.). Para la salida, está pasando un valor, que será promovido de float a double cuando se pase como parámetro variadic. Para la entrada se pasa un puntero, que no es promovido, así que hay que decirle a scanf si se quiere leer un float o un double, así que para scanf, %f significa que se quiere leer un float y %lf significa que se quiere leer un double (y, por si sirve de algo, para un long double, se usa %Lf para printf o scanf).


  1. C99, §6.5.2.2/6: "Si la expresión que denota la función llamada tiene un tipo que no incluye un prototipo, las promociones de entero se realizan en cada argumento, y los argumentos que tienen tipo float son promovidos a double. A esto se le llama promociones de argumentos por defecto." En C++ la redacción es algo diferente (por ejemplo, no utiliza la palabra "prototipo") pero el efecto es el mismo: todos los parámetros variádicos se someten a promociones por defecto antes de ser recibidos por la función.
Comentarios (6)

Puede ser %f, %g o %e dependiendo de cómo quiera formatear el número. Vea aquí para más detalles. El modificador l es necesario en scanf con double, pero no en printf.

Comentarios (2)

%Lf (nótese la "L" mayúscula) es el especificador de formato para dobles largos.

Para los dobles simples, se puede utilizar %e, %E, %f, %g o %G.

Comentarios (3)