web-dev-qa-db-fra.com

Objectif d'un ".f" ajouté à un numéro?

J'ai vu "1/3.f" dans un programme et je me demandais à quoi servait le ".f". J'ai donc essayé mon propre programme:

#include<iostream>
using namespace std;
int main()
{
        cout<<(float)1/3<<endl;
        cout<<1/3.f<<endl;
        cout<<1/3<<endl;
}

Le .f est-il utilisé comme un plâtre? N'importe quel endroit où je peux en savoir plus sur cette syntaxe intéressante?

49
Nav

Sans .f, Le nombre est interprété comme un entier, donc 1/3 Est (int)1/(int)3 => (int)0 Au lieu du (float)0.333333 Souhaité. Le .f Indique au compilateur d'interpréter le littéral comme un nombre à virgule flottante de type float. Il existe d'autres constructions telles que par exemple 0UL Qui signifie un (unsigned long)0, Alors qu'un simple 0 Serait un (int)0.

Le .f Est en fait deux composants, le . Qui indique que le littéral est un nombre à virgule flottante plutôt qu'un entier, et le suffixe f qui indique au compilateur le littéral doit être de type float plutôt que le type double par défaut utilisé pour les littéraux à virgule flottante.

Avertissement; la "construction de fonte" utilisée dans l'explication ci-dessus n'est pas une fonte réelle, mais juste un moyen d'indiquer le type du littéral.

Si vous voulez tout savoir sur les littéraux et les suffixes que vous pouvez y utiliser, vous pouvez lire la norme C++, ( 1997 draft , C++ 11 draft , - C++ 14 draft , C++ 17 draft ) ou bien, jetez un œil à un manuel décent, tel que Stroustrup's The C++ Programming Language .

Soit dit en passant, dans votre exemple (float)1/3 Les littéraux 1 Et 3 Sont en fait des entiers, mais le 1 est d'abord converti en un flottant par votre distribution, puis ensuite le 3 obtient transtypé implicitement en un flottant car il s'agit de l'opérande droit d'un opérateur à virgule flottante. (L'opérateur est en virgule flottante car son opérande de gauche est en virgule flottante.)

43
wich

3. est équivalent à 3.0, c'est un double.

f suivre un nombre littéral en fait un flottant.

55
peoro

Par défaut 3.2 est traité comme double; donc pour forcer le compilateur à le traiter comme float, vous devez écrire f à la fin.

Regardez cette démonstration intéressante:

float a = 3.2;
if ( a == 3.2 )
    cout << "a is equal to 3.2"<<endl;
else
    cout << "a is not equal to 3.2"<<endl;

float b = 3.2f;
if ( b == 3.2f )
    cout << "b is equal to 3.2f"<<endl;
else
    cout << "b is not equal to 3.2f"<<endl;

Production:

a n'est pas égal à 3,2
b est égal à 3,2f

Faites des expériences ici à ideone: http://www.ideone.com/WS1az

Essayez de changer le type de la variable a de float à double, voyez à nouveau le résultat!

19
Nawaz

3.f est l'abréviation de 3.0f - le nombre 3.0 comme littéral à virgule flottante de type float.

8
jcoder

Le point décimal et le f ont un objectif différent, ce n'est donc pas vraiment .f

Vous devez comprendre qu'en C et C++ tout est tapé, y compris les littéraux.

3 est un entier littéral. 3. est un double littéral 3.f est un flottant littéral.

Un flotteur IEEE a moins de précision qu'un double. float utilise seulement 32 bits, avec une mantisse de 22 bits et un exposant de 10 bits (y compris les bits de signe de chacun).

double vous donne plus de précision, mais parfois vous n'avez pas besoin d'une telle précision (par exemple si vous faites des calculs sur des chiffres qui ne sont que des estimations en premier lieu) et que celui donné par float suffira, et si vous en stockez un grand nombre ( par exemple, le traitement d'un grand nombre de données chronologiques) qui peut être plus important que la précision.

Ainsi, float est toujours un type utile.

Vous ne devez pas confondre cela avec la notation utilisée par printf et les instructions équivalentes.

2
CashCow