2013-11-21 13 views
5

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?

+1

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. –

risposta

8

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.

+0

"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

+0

@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

+1

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