“F” após o número / float em Objective-C / C

Não consigo encontrar isso nos documentos da Apple: o que o “f” depois dos números indica aqui? Isso é de C ou Objective-C? Existe alguma diferença em não adicionar isso a um número constante?

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

Você pode explicar por que eu não iria simplesmente escrever:

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

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

usa constantes de flutuação. (A constante 0.0 normalmente declara um double em Objective-C; colocar um f no final – 0.0f – declara a constante como um float (32 bits)).

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

usa ints que serão automaticamente convertidos em floats.

Neste caso, não há diferença (prática) entre os dois.

Em caso de dúvida, verifique a saída do montador. Por exemplo, escreva um snippet pequeno e mínimo como este

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

Em seguida, compile-o para o assembler com a opção -S .

 gcc -S test.m 

Salve a saída do assembler no arquivo test.s e remova .0f das constantes e repita o comando compile. Então faça um diff do novo test.s e do anterior. Acho que isso deve mostrar se existem diferenças reais. Eu acho que muitos têm uma visão do que eles acham que o compilador faz, mas no final do dia deve-se saber como verificar quaisquer teorias.

Às vezes há uma diferença.

 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. */ 

Ele informa ao computador que esse é um número de ponto flutuante (suponho que você esteja falando sobre c / c ++ aqui). Se não houver f após o número, será considerado um duplo ou um inteiro (dependendo se houver um decimal ou não).

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

Um literal de ponto flutuante em seu código-fonte é analisado como um duplo. Atribuir isso a uma variável que é do tipo float perderá precisão. Muita precisão, você está jogando fora 7 dígitos significativos. O “f” postfix permite que você diga ao compilador: “Eu sei o que estou fazendo, isso é intencional. Não me incomode sobre isso”.

As chances de produzir um bug não são tão pequenas. Muitos programas caíram em uma comparação de ponto flutuante mal concebida ou assumiram que 0.1 é exatamente representável.

O que você está falando provavelmente serve para dizer ao compilador que está trabalhando com um float. Quando você omite o f , geralmente é traduzido para um duplo.

Ambos são números de ponto flutuante, mas um float usa menos bits (portanto menores e menos precisos) que um double .

É uma coisa C – literais de ponto flutuante são precisão dupla (double) por padrão. A adição de um sufixo f torna-os com precisão simples (flutuação).

Você pode usar ints para especificar os valores aqui e, neste caso, não fará diferença, mas usar o tipo correto é um bom hábito – a consistência é uma coisa boa em geral, e se você precisar alterar esses valores mais tarde, saberá à primeira vista que tipo são.

De C. Isso significa constante literal de float. Você pode omitir ambos “f” e “.0” e usar ints no seu exemplo por causa da conversão implícita de ints em floats.

É quase certamente a partir de C e reflete o desejo de usar um tipo ‘float’ em vez de um tipo ‘double’. É semelhante a sufixos como L em números para indicar que são inteiros longos. Você pode usar apenas inteiros e o compilador será convertido automaticamente conforme apropriado (para esse cenário específico).

Ele geralmente diz ao compilador que o valor é um float , ou seja, um inteiro de ponto flutuante. Isso significa que ele pode armazenar números inteiros, decimais e exponenciais, por exemplo, 1 , 0.4 ou 1.2e+22 .