2011-06-30 15 views
6

En el lenguaje de programación C, la constante de coma flotante es de tipo doble
por lo que 3.1415 es de tipo doble, a menos que use el sufijo 'f' o 'F' para indicar el tipo de letra flotante.Asignar constante doble a variable flotante sin advertencia en C?

Supongo que const float pi = 3.1415 causará una advertencia, pero en realidad no.

cuando intento esto bajo gcc -Wall con:

float f = 3.1415926; 
double d = 3.1415926; 
printf("f: %f\n", f); 
printf("d: %f\n", d); 
f = 3.1415926f; 
printf("f: %f\n", f); 
int i = 3.1415926; 
printf("i: %d\n", i); 

el resultado es:

f: 3.141593 
d: 3.141593 
f: 3.141593 
i: 3 

el resultado (incluyendo doble variable), obviamente, perder precisión, pero compilar sin ninguna advertencia.
Entonces, ¿qué hizo el compilador con esto? o no entendí bien algo?

Respuesta

7

-Wall no habilita advertencias sobre pérdida de precisión, el truncamiento de valores, etc, porque estas advertencias son ruido molesto y "arreglarlos" requiere un código correcto y un montón de moldes feos. Si quieres advertencias de esta naturaleza, debes habilitarlas explícitamente.

Además, su uso de printf no tiene nada que ver con la precisión de las variables reales, solo la precisión printf está imprimiendo en, que por defecto es 6 lugares después del punto decimal.

+0

La naturaleza variable de 'printf' asegura que los flotantes se convierten implícitamente en dobles cuando se pasan? –

+0

Sí, aunque eso no tiene relación con la pregunta de OP. –

+0

Me pregunto cuál es mayor: la cantidad de errores que atrapan los mensajes de "posible pérdida de precisión del doble al flotar" o la cantidad de errores que se producen al codificar un programador que tiene que forzar explícitamente muchas cosas para que "flote" el compilador feliz, también obliga a 'flotar 'algo que no debería haber sido [por ejemplo, 'const float oneTenth = 1.0f/10.0f; float value1 = 8.0f * oneTenth; double value2 = 4.0f * oneTenth; 'Tenga en cuenta que si' oneTenth' podría haber sido 'double', todo habría funcionado perfectamente. – supercat

2

%f se puede utilizar con float y double. Si quieres más el uso de precisión

printf("f: %.16f",d); 

y esto es lo que está pasando bajo el capó:

float f = 3.1415926; // The double 3.1415926 is truncated to float 
double d = 3.1415926; 
printf("f: %f\n", f); 
printf("d: %f\n", d); 
f = 3.1415926f;  // Float is specified 
printf("f: %f\n", f); 
int i = 3.1415926; // Truncation from double to int 
printf("i: %d\n", i); 
+0

¿No debería ser '% lf' para un doble? –

+3

@sharth: 'lf' y' f' son diferentes para 'scanf' pero lo mismo en' printf' – Jacob

1

Si desea recibir advertencias para esto, creo que -Wconversion las señala en la línea principal gcc-4.3 y posterior.

Si usa OS X, -Wshorten-64-to-32 ha estado marcándolos en GCC de Apple desde gcc-4.0.1. Sin embargo, creo que el clang coincide con el comportamiento del gcc principal.

Cuestiones relacionadas