web-dev-qa-db-fra.com

Suffixe "f" sur la valeur float?

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?

63
Alex

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++)

66
James

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

33
Lundin

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

11
Grijesh Chauhan

3.00 est un double, 3.00f est un float.

5
Erik

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
0
SridharKritha

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).

0
user284291

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
0
Frederik Slijkerman