Solución:
3.00
se interpreta como un double
, Opuesto a 3.00f
que es visto por el compilador como un float
.
los f
sufijo simplemente le dice al compilador cuál es un float
y que es un double
.
Ver MSDN (C ++)
Además de lo que ya se ha dicho, hacer un seguimiento de 1.0 frente a 1.0f es más importante de lo que muchas personas creen. Si escribe un código como este:
float x;
...
float y = x * 2.0;
Entonces x se promoverá a un doble, porque 2.0 es un doble. El compilador no puede optimizar esa promoción o violaría el estándar C. El cálculo se realiza con doble precisión y, a continuación, el resultado se trunca implícitamente en un flotante. Esto significa que el cálculo será más lento (aunque más preciso) de lo que hubiera sido si hubiera escrito 2.0fo 2.
Si hubiera escrito 2, la constante sería de tipo int, que se promovería a flotante, y el cálculo se habría realizado con “precisión flotante”. Un buen compilador le advertirá sobre esta promoción.
Lea más sobre las reglas de “conversión aritmética habitual” aquí:
http://msdn.microsoft.com/en-us/library/3t4w2bkb%28v=vs.80%29.aspx
Porque los literales de punto flotante sin sufijo son dobles, y el redondeo significa que incluso los literales pequeños pueden tomar diferentes valores cuando se redondean a flotante y doble. Esto se puede observar en el siguiente ejemplo:
float f=0.67;
if(f == 0.67)
printf("yes");
else
printf("no");
Esto saldrá no
, porque 0.67
tiene un valor diferente cuando se redondea para flotar que cuando se redondea al doble. Por otra parte:
float f=0.67;
if(f == 0.67f)
printf("yes");
else
printf("no");
salidas yes
.
El sufijo se puede especificar con letras mayúsculas o minúsculas.
Prueba esto también:
printf(" %u %un", sizeof(.67f), sizeof(.67));
Compruebe @codepade