In C++, è meglio utilizzare double
per impostazione predefinita e float
o long double
solo quando sappiamo veramente che ne abbiamo bisogno. Per OpenGL, tuttavia, vedo che GLfloat
sembra essere l'impostazione predefinita. È ancora pertinente considerando che la doppia precisione è ora comune sulle nuove GPU?GLfloat o GLdouble di default?
risposta
L'opposto è il caso. Si dovrebbe usare float
per impostazione predefinita in C++ e utilizzare solo double
se si è sicuri di aver veramente bisogno di quelle cifre aggiuntive di precisione (per alcune simulazioni scientifiche, presumibilmente astronomiche o di fisica delle particelle). Spesso quando pensi di aver bisogno di double
, dovresti usare il punto fisso, o dovresti ottenere i valori float
nell'intervallo corretto.
non utilizzare la precisione doppia per la grafica. Sebbene tutte le GPU moderne lo supportino, la matematica a doppia precisione è spesso più lenta della precisione singola e non ha alcun vantaggio osservabile. Tutto ciò che riguarda la "grafica" (o diciamo il 99,99% dal momento che "tutto" è un testo molto preciso) funziona bene usando float
o GLfloat
per quella materia.
Anche alcuni anni fa, quando alcune GPU funzionavano con una precisione di soli 24 bit, non c'era alcuna differenza visibile.
In effetti, quando le persone usano double
perché pensano che pensino allo, il 99% delle volte lo fanno nel modo sbagliato.
Tom Forsyth ha anche fatto "doppia precisione" il primo punto del suo Offend-O-Matic. Si riferisce in particolare ai "giochi", ma si applica davvero a quasi tutti i software, con alcune simulazioni scientifiche che fanno eccezione. Assicurati di leggere anche l'articolo di accompagnamento A Matter of Precision per capire il suo ragionamento.
Una lettura meno offensiva in virgola mobile è la presentazione di Ericson epsilon is not 0.000001.
È molto simile in OpenGL. Se capisci come funziona il floating point e lo usi correttamente, allora float
funzionerà bene. Gli errori di arrotondamento quando si applica una matrice di trasformazione o simili non sono visibili.
Se non capisci come funziona, l'uso di una precisione doppia sposta leggermente i problemi all'indietro, ma ti morderà ancora quando non te lo aspetti.
Incredibilmente, anche al giorno d'oggi le persone usano ancora doppia precisione in virgola mobile anche per cause assurde come valuta o tempo (perché è due volte tanto preciso, eh?) E sono sorpresi quando soffia nel loro volto e la gente inizia a urlare a loro.
"La matematica a doppia precisione è spesso più lenta della precisione singola e non ha alcun vantaggio osservabile". Sei sicuro di questo? Almeno dai maggiori dettagli perché sembra semplicemente sbagliato nel caso generale. – Korchkidu
@Korchkidu: vedere ad esempio [questo] (http://devgurus.amd.com/thread/150557). Inoltre, usando 'GLdouble' ad es. per gli attributi dei vertici si raddoppieranno letteralmente i requisiti di larghezza di banda PCIe e la pressione cache. Il risultato sullo schermo è lo stesso, tuttavia (come dimostrato dalle prime implementazioni AMD che utilizzavano solo la precisione a 24 bit e che comunque funzionava bene). – Damon
L'esempio riguarda GPU. Ma nel caso generale (C++ su CPU), ho sentito solo il contrario double> float. Per GPU e GLfloat/Gldouble non lo so, è per questo che lo sto chiedendo. Sembra che GLfloat> Gldouble allora. – Korchkidu
- 1. Perché c'è GLint e GLfloat?
- 2. Uso di GLshort invece di GLfloat per i vertici
- 3. La singola o di default con condizione o clausola Where
- 4. Errore GCC o non: default std :: function?
- 5. Idiota rubino: chiamata metodo o altro default
- 6. varchar2 (n BYTE | CAR) di default -> CHAR o BYTE
- 7. Return system.time di default
- 8. SimpleListFIlter default
- 9. C++ distruttore di default
- 10. Cambia l'icona di default
- 11. default Tipo di raccolta
- 12. C# parametri di default
- 13. Come mostrare ionicPopover di default
- 14. Better DateTime? o usa default (DateTime) per NULL?
- 15. Rake non sa come creare attività: default o minitest
- 16. Perché preferences.getString ("chiave", "DEFAULT") restituisce sempre "DEFAULT"?
- 17. predefinito mossa costruttore di default contro costruttore di copia di default vs. operatore di assegnamento
- 18. Xcode Posizione simulata di default
- 19. Scala default Set Implementazione
- 20. Resa e caso di default || non caso di default di uscita
- 21. ToString() default CultureInfo
- 22. Nascondere un div di default
- 23. Percorso di default grok pattern
- 24. Django - Generazione di default slug
- 25. di default jQuery Ajax statusCode
- 26. Default di stub in Mockito
- 27. AdminLTE crollato scatole di default
- 28. parametri di default in C++
- 29. Differenza tra null default null e default null in mysql?
- 30. Ottenere 'Contesto non è costruibile. Aggiungere un costruttore di default o di fornire un'implementazione di IDbContextFactory ".
La doppia precisione non è in realtà "comune". L'ultimo hardware lo supporta, ma a corto di applicazioni GPGPU non ha un uso immediato. Raddoppia letteralmente i requisiti di archiviazione, il che significa che 'dvec4' prende il doppio degli slot di attribuzione dei vertici come' vec4', per esempio. Si esauriscono le risorse, sia la memoria sia il limite di implementazione GLSL, molto più rapidamente se si utilizza la precisione doppia. Non è inoltre possibile campionare trame con precisione doppia tra le altre cose. Solo * parte * della pipeline supporta la precisione doppia, ed è soprattutto la parte che scricchiola i numeri. –