web-dev-qa-db-fra.com

"f" après nombre / flottant dans Objective-C / C

Je ne trouve pas cela dans les documents Apple alors: qu'est-ce que le "f" après les chiffres indique? Est-ce de C ou d'Objectif-C? Y a-t-il une différence à ne pas l'ajouter à un nombre constant?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

Pouvez-vous expliquer pourquoi je n'écrirais pas simplement:

CGRect frame = CGRectMake(0, 0, 320, 50);
97
typeoneerror
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

utilise des constantes flottantes. (La constante 0.0 déclare généralement un double dans Objective-C; mettre un f à la fin - 0.0f - déclare la constante comme un flottant (32 bits).)

CGRect frame = CGRectMake(0, 0, 320, 50);

utilise des nombres entiers qui seront automatiquement convertis en flottants.

Dans ce cas, il n'y a pas de différence (pratique) entre les deux.

85
Frank Shearar

En cas de doute, vérifiez la sortie de l'assembleur. Par exemple, écrivez un petit extrait minimal, comme ceci

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}

Compilez-le ensuite avec l'assembleur avec le -S option.

gcc -S test.m

Enregistrez la sortie de l'assembleur dans le test.s fichier et supprimer .0f à partir des constantes et répétez la commande de compilation. Faites ensuite un diff du nouveau test.s et le précédent. Pensez que cela devrait montrer s'il y a de réelles différences. Je pense que trop de gens ont une vision de ce qu'ils pensent que le compilateur fait, mais à la fin de la journée, il faut savoir vérifier toutes les théories.

53
epatel

Parfois, il y a une différence.

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */
41
Potatoswatter

Il indique à l'ordinateur qu'il s'agit d'un nombre à virgule flottante (je suppose que vous parlez de c/c ++ ici). S'il n'y a pas de f après le nombre, il est considéré comme un double ou un entier (selon qu'il existe ou non une décimale).

3.0f -> float
3.0 -> double
3 -> integer
24
NickLH

Le f dont vous parlez est probablement destiné à indiquer au compilateur qu'il fonctionne avec un flotteur. Lorsque vous omettez le f, il est généralement traduit en double.

Les deux sont des nombres à virgule flottante, mais un float utilise moins de bits (donc plus petits et moins précis) qu'un double.

4
Yuri

C'est un truc en C - les littéraux à virgule flottante sont en double précision (double) par défaut. L'ajout d'un suffixe f les rend simple précision (float).

Vous pouvez utiliser des entiers pour spécifier les valeurs ici et dans ce cas, cela ne fera aucune différence, mais l'utilisation du bon type est une bonne habitude à prendre - la cohérence est une bonne chose en général, et si vous devez modifier ces valeurs plus tard, vous 'saurai à première vue de quel type ils sont.

3
Paul R

De C. Cela signifie float littéral constant. Vous pouvez omettre "f" et ".0" et utiliser des entiers dans votre exemple en raison de la conversion implicite des entiers en flottants.

2
Wildcat

Il est presque certainement de C et reflète le désir d'utiliser un type "flottant" plutôt qu'un type "double". Il est similaire aux suffixes tels que L sur les nombres pour indiquer qu'il s'agit de longs entiers. Vous pouvez simplement utiliser des entiers et le compilateur se convertira automatiquement selon les besoins (pour ce scénario spécifique).

1
tyranid

Il indique généralement au compilateur que la valeur est un float , c'est-à-dire un entier à virgule flottante. Cela signifie qu'il peut stocker des entiers, des valeurs décimales et des exponentielles, par ex. 1, 0.4 ou 1.2e+22.

0
Polynomial