2013-03-22 20 views
15

Vedo questo tutto il tempo:Qual è il punto di utilizzo di 'f' quando si assegna un valore a un CGFloat?

CGFloat someCGFloat = 1.2f; 

Perché la 'f' utilizzato? Se lo CGFloat è definito come float, il valore verrà convertito in float e se lo CGFloat è definito come double, il valore verrà convertito in double.

E 'solo per assicurarsi che una conversione da double a float non si verifica? Qual è il punto di farlo? Inoltre, il compilatore non si prenderà cura di questo?

MODIFICA: Hmmm ... quale risposta per accettare ... entrambi sono molto buoni!

+1

Non so di un punto in un incarico di dichiarazione. Penso che la f possa essere utile se non si utilizza la costante in un termine costante (ad esempio 'someFloat = 3.0 * someOtherFloat' potrebbe effettivamente portare a conversioni inutili a seconda del compilatore.) Tuttavia non risponde alla domanda. –

+0

@MaxE. Io vedo. Questo è utile, grazie! – fumoboy007

+0

La leggibilità non deve essere scontata. – GoZoner

risposta

8

1.0 di default è doppio, se il valore corretto è 1.2 c'è un cast implicito e il valore viene convertito da doppio a float (il cast non è un'operazione di runtime). In questo caso non è importante chiamarlo 1.2f. I programmatori lo maltrattano principalmente, ma ci sono casi in cui è davvero importante.

Ad esempio:

float var= 1.0e-45; 
NSLog(@"%d",var==1.0e-45); 

Questo stampa zero, perché 1.0e-45 è troppo piccolo per essere immagazzinata in una singola precisione floating point variabile, così diventa uguale a zero. Scrivere var == 1.0e-45f cambia il risultato.

L'utilizzo degli specificatori di formato è importante soprattutto durante la scrittura di espressioni e, poiché il valore di sinistra è un float, ci si aspetta che anche l'espressione venga trattata come float, ma non è ciò che accade.

Un caso più eclatante è quando si utilizza l'identificatore l formato su un numero che viene spostato così tanto da diventare a zero, e ottenere sorpreso per il risultato:

long var= 1<<32; // I assume that an int takes 4 bytes and a long 8 bytes 

Il risultato è pari a zero, e la scrittura 1l < < 32 cambia completamente il risultato.

7

Nel proprio frammento, solo un compito, non è necessario il suffisso 'f', e in effetti non si dovrebbe usare. Se CGFloat è a precisione singola (come in iOS), il tuo valore verrà archiviato con precisione singola con o senza 'f' e se CGFloat è a doppia precisione (come su Mac OS), creerai inutilmente un singolo valore di precisione per essere memorizzato a doppia precisione.

D'altra parte, se si sta eseguendo l'aritmetica si dovrebbe fare attenzione a usare "f" o non usarlo come appropriato. Se stai lavorando con una precisione singola e includi un letterale come "1.2" senza la "f", allora il compilatore promuoverà gli altri operandi con una precisione doppia. E se stai lavorando con una precisione doppia e includi la 'f' allora (come l'assegnazione su Mac OS) creerai un valore di precisione singolo solo per convertirlo immediatamente in doppio.

Problemi correlati