Je me demande quelle est la différence entre ces deux variables en C:
float price = 3.00;
et
float price = 3.00f;
Le "f" de fuite?
3.00
est interprété comme une double
, par opposition à 3.00f
qui est considéré par le compilateur comme une float
.
Le suffixe f
indique simplement au compilateur qui est une float
et qui est une double
.
Voir MSDN (C++)
En plus de ce qui a déjà été dit, garder une trace de 1.0 contre 1.0f est plus important que beaucoup de gens ne le réalisent. Si vous écrivez un code comme celui-ci:
float x;
...
float y = x * 2.0;
Alors x sera promu à un double, car 2.0 est un double. Le compilateur n'est pas autorisé à optimiser cette promotion car cela violerait le standard C. Le calcul s'effectue avec une double précision, puis le résultat est implicitement tronqué en un float. Cela signifie que le calcul sera plus lent (bien que plus précis) que si vous aviez écrit 2.0f ou 2.
Si vous aviez écrit 2, la constante serait de type int, ce qui passerait à un float, et le calcul aurait été effectué avec une "précision de float". Un bon compilateur vous avertirait de cette promotion.
En savoir plus sur les règles de "conversion arithmétique habituelle" ici:
http://msdn.Microsoft.com/en-us/library/3t4w2bkb%28v=vs.80%29.aspx
Parce que les littéraux à virgule flottante non compressés sont des doubles, et que l'arrondi signifie que même les petits littéraux peuvent prendre des valeurs différentes lorsqu'ils sont arrondis à float et double. Ceci peut être observé dans l'exemple suivant:
float f=0.67;
if(f == 0.67)
printf("yes");
else
printf("no");
Ceci produira no
, car 0.67
a une valeur différente lorsque arrondi à float, il est différent de celui obtenu lorsque doublé. D'autre part:
float f=0.67;
if(f == 0.67f)
printf("yes");
else
printf("no");
sorties yes
.
Le suffixe peut être spécifié en lettres majuscules ou minuscules.
Essayez ceci aussi:
printf(" %u %u\n", sizeof(.67f), sizeof(.67));
Check @ codepade
3.00 est un double, 3.00f est un float.
Ajoutant quelques combinaisons de comparaisons supplémentaires entre les types de données float et double.
int main()
{
// Double type constant(3.14) converts to Float type by
// truncating it's bits representation
float a = 3.14;
// Problem: float type 'a' promotes to double type and the value
// of 'a' depends on how many bits added to represent it.
if(a == 3.14)
std::cout<<"a: Equal"<<std::endl;
else
std::cout<<"a: Not Equal"<<std::endl;
float b = 3.14f; // No type conversion
if(b == 3.14) // Problem: Float to Double conversion
std::cout<<"b: Equal"<<std::endl;
else
std::cout<<"b: Not Equal"<<std::endl;
float c = 3.14; // Double to Float conversion (OK even though is not a good practice )
if(c == 3.14f) // No type conversion
std::cout<<"c: Equal"<<std::endl; // OK
else
std::cout<<"c: Not Equal"<<std::endl;
float d = 3.14f;
if(d == 3.14f)
std::cout<<"d: Equal"<<std::endl; // OK
else
std::cout<<"d: Not Equal"<<std::endl;
return 0;
}
Sortie:
a: Not Equal
b: Not Equal
c: Equal
d: Equal
Cela est dû au fait que le type par défaut d'un littéral numérique à virgule flottante .__ - les caractères 3.00 est double pas float . Pour créer cette compilation, vous devez ajouter le suffixe f (ou F).
Souvent, la différence n'est pas importante, car le compilateur convertira de toute façon la double constante en float. Cependant, considérez ceci:
template<class T> T min(T a, T b)
{
return (a < b) ? a : b;
}
float x = min(3.0f, 2.0f); // will compile
x = min(3.0f, 2); // compiler cannot deduce T type
x = min(3.0f, 2.0); // compiler cannot deduce T type