2010-09-12 12 views
9

ho avuto alcune domande su mettendo f accanto valori letterali. So che lo definisce come un float ma ne ho davvero bisogno? È questo 2.0f * 2.0f più veloce o compilato qualcosa di diverso rispetto 2.0 * 2.0? Una dichiarazione come float a = 2.0; è compilata in modo diverso da float a = 2.0f;?Differenza tra 2.0 e 2.0f (float esplicito vs doppie letterali)

+3

Vuoi dire "valori letterali", non "i nomi delle variabili". '2.0' è un valore letterale' double'. '2.0f' è un valore letterale' float'. '2' è un valore letterale' int'. Nessuna di queste sono variabili. – RBerteig

+0

@RBerteig Il mio male :) –

+0

dispiace, non volevo suonare come mi è stato ranting lì ... Probabilmente avrei dovuto appena modificato il corpo in silenzio. – RBerteig

risposta

19

A volte è necessario per avere in modo esplicito tipo float, come nel caso seguente

float f = ...; 
float r = std::max(f, 42.0); // won't work; (float, double). 
float r = std::max(f, 42.0f); // works: both have same type 
6

Raramente ho a che fare con la velocità (almeno direttamente), ma il fatto che altrimenti il ​​compilatore avviserà sulla conversione di double in float.

+0

Ok ma sull'esempio a * 2.0 si usa davvero la doppia moltiplicazione? –

+2

In teoria, credo che dovrebbe risultare nel moltiplicare due 'double's, che convertono il risultato in' float'. In realtà, essendo 2.0, è probabile che il compilatore possa/scoprirà che può usare 'float' dappertutto. OTOH, ci sono dei limiti obbligatori per ottimizzare la matematica FP (specialmente in C99), quindi renderlo esplicito potrebbe aiutare. –

+0

sì, stavo usando solo 2.0 come esempio. Grazie per l'aiuto. –

3

per quanto ne so, su "normali" PC (x86 con x87 -come coprocessore matematico) la differenza di velocità è irrilevante, dal momento che i calcoli sono comunque eseguiti internamente con precisione a 80 bit.

I galleggianti possono acquisire importanza quando si devono gestire grandi matrici di numeri in virgola mobile (calcoli scientifici o cose del genere), quindi avere un tipo di dati più piccolo può essere conveniente, sia per utilizzare meno memoria sia per essere più veloce da leggere loro da RAM/disco.

Può anche essere utile usare i float invece dei doppi su macchine prive di un'unità a virgola mobile (ad esempio la maggior parte dei microcontrollori), dove tutta l'aritmetica in virgola mobile viene eseguita nel software dal codice inserito dal compilatore; in questo caso, potrebbe esserci un aumento della velocità di funzionamento sui float (e in tali ambienti spesso anche ogni bit di memoria è importante).

Su PC, IMO si può semplicemente usare il doppio in contesti "normali", basta provare a evitare di mescolare i tipi di dati (doppio, float, ints, ...) nella stessa espressione per evitare conversioni inutili costose. Comunque, con i letterali il compilatore dovrebbe essere abbastanza intelligente da eseguire la conversione in fase di compilazione.

+0

Sì, sto usando l'iphone. –

+0

Dal momento che quello che ho letto, il processore è un iPhone ARM1176 con la FPU facoltativa prevista (vedi qui: http://www.arm.com/products/processors/technologies/vector-floating-point.php); Non ne sono esperto, ma non credo che la velocità cambi molto con i float/raddoppia in questo caso. La mia unica preoccupazione è che ha "16 doppia precisione o 32 registri di precisione singolo", in modo da utilizzare solo galleggia puoi guadagnare qualcosa dai registri supplementari, ma può dipendere anche da come l'ambiente è configurato. –

+0

Beh, so che puoi ma sul doppio dell'iPhone è decisamente più lento che fluttuare. –

Problemi correlati