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)
risposta
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
Raramente ho a che fare con la velocità (almeno direttamente), ma il fatto che altrimenti il compilatore avviserà sulla conversione di double
in float
.
Ok ma sull'esempio a * 2.0 si usa davvero la doppia moltiplicazione? –
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. –
sì, stavo usando solo 2.0 come esempio. Grazie per l'aiuto. –
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.
Sì, sto usando l'iphone. –
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. –
Beh, so che puoi ma sul doppio dell'iPhone è decisamente più lento che fluttuare. –
- 1. Differenze tra letterali e costruttori? ([] Vs Array.new e {} vs Hash.new)
- 2. Differenza tra #Define e Float?
- 3. Clojure^float vs. #^float?
- 4. Differenza tra float e double in php?
- 5. Differenza tra float Python e numpy float32
- 6. Qual è la differenza tra Float e float in java?
- 7. differenza tra HTTP 1.1 e HTTP 2.0
- 8. Differenza tra stringhe singole e doppie in ActionScript
- 9. Ruby - qual è la differenza tra virgolette singole e doppie?
- 10. Differenza tra l'uso di virgolette doppie e virgolette in python
- 11. differenza tra liste doppie collegate e lista doppiamente collegata
- 12. Differenza tra virgolette singole e doppie virgolette in Javascript
- 13. Differenza tra virgolette doppie e singole in fortran?
- 14. tipi letterali: 0x1ull vs 0x1llu
- 15. C# funzione 'non sicuri' - * (float *) (e risultato) vs. (float) (risultato)
- 16. differenza Junit tra assertEquals (doppie, matrimoniali) e assertEquals (doppie, matrimoniale, delta)
- 17. Dovremmo generalmente usare i letterali float per i float invece dei doppi letterali più semplici?
- 18. differenza tra grep Vs cat e grep
- 19. doppie virgolette vs apici in JavaScript
- 20. Gradle Singolo vs Virgolette doppie
- 21. Differenza tra 'e "entro Lua
- 22. iPhone: Differenza tra nil vs Nil e vero vs TRUE
- 23. Differenza tra @available e #available in swift 2.0
- 24. Qual è la differenza tra Lego Mindstorms 1.0 e 2.0
- 25. Differenza tra OpenGL ES 2.0 e OpenGL 4
- 26. angolare 2.0 - Qual è la differenza tra @ViewQuery e @query
- 27. qual è la differenza tra "Float a = 3f" e "Float a = 3.0" in java?
- 28. Qual è la differenza tra float * varname e float * varname nel classico c
- 29. Differenza tra knockout Visualizza i modelli dichiarato come letterali oggetto vs funzioni
- 30. Differenza tra NSWindowController Vs NSViewController
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
@RBerteig Il mio male :) –
dispiace, non volevo suonare come mi è stato ranting lì ... Probabilmente avrei dovuto appena modificato il corpo in silenzio. – RBerteig