2013-11-21 137 views
5

在C++中,仅当我们确实知道我们需要它们时,最好默认使用double,而使用floatlong double。但对于OpenGL,我看到GLfloat似乎是默认设置。考虑到双精度现在在最新的GPU上很常见,是否仍然适用?默认情况下是GLfloat还是GLdouble?

+1

双精度实际上不是“常见”。最新的硬件支持它,但缺少GPGPU应用程序,它没有立即使用。它实际上将存储需求加倍,这意味着例如'dvec4'的顶点属性槽数是'vec4'的两倍。如果使用双精度,则用尽资源,内存和GLSL实现限制明显更快。除此之外,您也无法以双精度对纹理进行采样。只有流水线的*部分支持双精度,并且大部分是仰卧起坐数字的部分。 –

回答

8

情况正好相反。您应该在C++中默认使用float,如果您确实确实需要这些额外的精度数字(对于某些科学的,可能是天文学或粒子物理的模拟),则只能使用double。通常当你认为你需要double时,你应该使用定点,或者你应该把你的float值放到正确的范围内。

你做不是图形使用双精度。尽管所有现代GPU都支持它,但双精度数学运算通常比单精度数学运算速度慢,并且没有明显的优势。所有与“图形”有关的东西(或者说,因为“所有东西”都是99.99%是一个非常明确的措词),对于这个问题,使用floatGLfloat就可以很好地工作。
甚至在几年前,当一些GPU仅以24位精度工作时,没有明显的差异。

事实上,当人们使用double,因为他们认为他们应该,然后99%的时间他们做错了。

Tom Forsyth甚至在他的Offend-O-Matic的第一个点上做出了“双精度”。他特别涉及“游戏”,但它几乎适用于所有软件,一些科学模拟是例外。请务必阅读相关文章A Matter of Precision以了解他的推理。
埃里克森的epsilon is not 0.000001演示文稿中浮点数不太令人反感。

它在OpenGL中非常相似。如果您了解浮点运行方式并正确使用它,那么float就可以正常工作。应用变换矩阵等时的舍入误差不可见。
如果你不明白它是如何工作的,那么使用双精度会使问题向后移动一点,但当你不期待它时,它仍会咬你。

令人震惊,甚至现在人们还在使用双精度浮点甚至是荒谬的原因,就像货币或时间(因为它是两倍精确,是吗?)时,都很惊讶,当它在自己的脸上吹起来,人们开始喊叫在他们身上。

+0

“双精度数学运算通常比单精度要慢,并且没有明显的优势”。你确定吗?至少提供更多的细节,因为在一般情况下它似乎只是错误的。 – Korchkidu

+0

@Korchkidu:看例如[this](http://devgurus.amd.com/thread/150557)。另外,使用'GLdouble'例如对于顶点属性,将从字面上加倍PCIe带宽要求和缓存压力。然而屏幕上的结果是一样的,但是(早期的AMD实现只使用了24位精度,而且工作得很好)。 – Damon

+1

你的例子是关于GPU。但在一般情况下(CPU上的C++),我只听到相反的double> float。对于GPU和GLfloat/Gldouble我不知道,这就是为什么我问。看来GLfloat> Gldouble了。 – Korchkidu

相关问题