2013-11-21 8 views
5

W C++ lepiej jest używać domyślnie double i float lub long double tylko wtedy, gdy naprawdę wiemy, że ich potrzebujemy. Jednak dla OpenGL widzę, że domyślnie jest GLfloat. Czy jest to nadal istotne, biorąc pod uwagę, że podwójna precyzja jest obecnie powszechna w najnowszych procesorach graficznych?GLfloat lub GLDouble domyślnie?

+1

Podwójna precyzja właściwie nie jest "pospolita". Najnowszy sprzęt obsługuje go, ale brakuje w nim aplikacji GPGPU, nie ma on natychmiastowego zastosowania. Dosłownie podwaja wymagania pamięci masowej, co oznacza, że ​​'dvec4' zajmuje na przykład dwa razy więcej gniazd werteksów, jak na przykład' vec4'. Wyczerpane zasoby, zarówno pamięć, jak i limit implementacji GLSL, są znacznie mądrzejsze, o wiele szybsze, jeśli użyjesz podwójnej precyzji. Nie można również próbkować tekstur z podwójną precyzją między innymi. Tylko * część * potoku obsługuje podwójną precyzję i jest to głównie część, która chrupie cyfry. –

Odpowiedz

8

Jest odwrotnie. Powinieneś domyślnie używać float w C++ i używać tylko double, jeśli masz całkowitą pewność, że naprawdę potrzebujesz tych dodatkowych cyfr precyzji (dla jakiejś naukowej, przypuszczalnie astronomicznej lub cząstek elementarnych, symulacji). Często gdy myślisz, że potrzebujesz double, powinieneś używać stałego punktu, lub powinieneś uzyskać wartości float we właściwym zakresie.

Wykonujesz nie używać podwójnej precyzji do grafiki. Chociaż wszystkie nowoczesne procesory graficzne obsługują to dobrze, podwójna precyzja matematyki jest często wolniejsza niż pojedyncza precyzja i nie ma widocznej przewagi. Wszystko, co wiąże się z "grafiką" (lub powiedzmy 99,99% od "wszystkiego" jest bardzo konkretnym sformułowaniem) działa dobrze, używając do tego celu float lub GLfloat.
Nawet kilka lat temu, gdy niektóre układy GPU pracowały tylko z 24-bitową precyzją, nie było widocznej różnicy.

W rzeczywistości, gdy ludzie używają double, ponieważ myśleć powinny, a następnie 99% czasu, że robią to źle.

Tom Forsyth zrobił nawet "podwójną precyzję" jako pierwszy punkt swojego Offend-O-Matic. W szczególności odnosi się do "gier", ale tak naprawdę odnosi się do niemal każdego oprogramowania, z wyjątkiem niektórych symulacji naukowych. Koniecznie przeczytaj także towarzyszący artykuł A Matter of Precision, aby zrozumieć jego rozumowanie.
Mniej ofensywny odczyt na zmiennoprzecinkowy to prezentacja Ericsona epsilon is not 0.000001.

Jest to bardzo podobne w OpenGL. Jeśli rozumiesz, jak działa zmiennoprzecinkowy i poprawnie go używasz, wtedy float będzie działał dobrze. Błędy zaokrąglania podczas stosowania macierzy przekształcenia lub takie nie są widoczne.
Jeśli nie rozumiesz, jak to działa, użycie podwójnej precyzji nieco przesunie problemy w tył, ale nadal będzie cię gryźć, kiedy się tego nie spodziewasz.

Oszałamiająco, nawet w dzisiejszych czasach ludzie nadal korzystać z podwójnej precyzji zmiennoprzecinkowych nawet absurdalnych przyczyn, takich jak waluty lub czasu (bo to dwa razy tyle precyzyjne, eh?) I są zaskoczeni, kiedy wieje w twarz i ludzie zaczynają wrzeszczeć na nich.

+0

"matematyka z podwójną precyzją jest często wolniejsza niż pojedyncza precyzja i nie ma widocznej przewagi". Czy jesteś tego pewien? Przynajmniej daj więcej szczegółów, ponieważ w ogólnym przypadku wydaje się po prostu nie tak. – Korchkidu

+0

@Korchkidu: Zobacz na przykład [to] (http://devgurus.amd.com/thread/150557). Ponadto, używając 'GLdouble' np. dla atrybutów vertex dosłownie podwójne wymagania przepustowości PCIe i ciśnienie cache. Wynik na ekranie jest jednak taki sam (co udowodniły wczesne implementacje AMD, które wykorzystywały jedynie 24-bitową precyzję i które działały bez zarzutu). – Damon

+1

Twój przykład dotyczy GPU. Ale w ogólnym przypadku (C++ na procesorze) usłyszałem tylko podwójne podwójne> unoszenie się. Dla GPU i GLfloat/Gldouble nie wiem, dlatego proszę. Wygląda na to, że GLfloat> Gldouble then. – Korchkidu