在C++中,仅当我们确实知道我们需要它们时,最好默认使用double
,而使用float
或long double
。但对于OpenGL,我看到GLfloat
似乎是默认设置。考虑到双精度现在在最新的GPU上很常见,是否仍然适用?默认情况下是GLfloat还是GLdouble?
回答
情况正好相反。您应该在C++中默认使用float
,如果您确实确实需要这些额外的精度数字(对于某些科学的,可能是天文学或粒子物理的模拟),则只能使用double
。通常当你认为你需要double
时,你应该使用定点,或者你应该把你的float
值放到正确的范围内。
你做不是图形使用双精度。尽管所有现代GPU都支持它,但双精度数学运算通常比单精度数学运算速度慢,并且没有明显的优势。所有与“图形”有关的东西(或者说,因为“所有东西”都是99.99%是一个非常明确的措词),对于这个问题,使用float
或GLfloat
就可以很好地工作。
甚至在几年前,当一些GPU仅以24位精度工作时,没有明显的差异。
事实上,当人们使用double
,因为他们认为他们应该,然后99%的时间他们做错了。
Tom Forsyth甚至在他的Offend-O-Matic的第一个点上做出了“双精度”。他特别涉及“游戏”,但它几乎适用于所有软件,一些科学模拟是例外。请务必阅读相关文章A Matter of Precision以了解他的推理。
埃里克森的epsilon is not 0.000001演示文稿中浮点数不太令人反感。
它在OpenGL中非常相似。如果您了解浮点运行方式并正确使用它,那么float
就可以正常工作。应用变换矩阵等时的舍入误差不可见。
如果你不明白它是如何工作的,那么使用双精度会使问题向后移动一点,但当你不期待它时,它仍会咬你。
令人震惊,甚至现在人们还在使用双精度浮点甚至是荒谬的原因,就像货币或时间(因为它是两倍精确,是吗?)时,都很惊讶,当它在自己的脸上吹起来,人们开始喊叫在他们身上。
“双精度数学运算通常比单精度要慢,并且没有明显的优势”。你确定吗?至少提供更多的细节,因为在一般情况下它似乎只是错误的。 – Korchkidu
@Korchkidu:看例如[this](http://devgurus.amd.com/thread/150557)。另外,使用'GLdouble'例如对于顶点属性,将从字面上加倍PCIe带宽要求和缓存压力。然而屏幕上的结果是一样的,但是(早期的AMD实现只使用了24位精度,而且工作得很好)。 – Damon
你的例子是关于GPU。但在一般情况下(CPU上的C++),我只听到相反的double> float。对于GPU和GLfloat/Gldouble我不知道,这就是为什么我问。看来GLfloat> Gldouble了。 – Korchkidu
- 1. 默认情况下,是DispatchQueue .serial还是.concurrent?
- 2. 默认情况下是转发dopost还是doget?
- 3. ,async:默认情况下是否为假?
- 4. ,默认情况下是安全的?
- 5. 默认情况下,WPF中的所有操作是同步还是异步?
- 6. 默认情况下Web服务参数是必需的还是可选的?
- 7. 默认情况下,WCF服务是基于rest还是基于soap?
- 8. 产量和默认情况||不输出默认情况下
- 9. 安卓:默认情况下
- 10. 默认情况下,法国
- 11. 默认情况下,Constexpr lambda?
- 12. 默认情况下在VBox
- 13. 在默认情况下
- 14. FactoryGirl在默认情况下
- 15. 默认情况下,Java构造函数是不是公共的?
- 16. 默认情况下,classpath中的当前路径是否是“。”?
- 17. 默认情况下,Ruby on Rails会刷新页面还是使用ajax?
- 18. jQuery的数据表崩溃默认情况下,在默认情况下是这样
- 19. 是必需的默认情况
- 20. 默认情况下修改默认命令:默认命令为
- 21. 默认情况下从位显示是/否
- 22. 在C++中,默认情况下是`int long`吗?
- 23. 默认情况下,TensorFlow作业是否使用多个核心?
- 24. 默认情况下函数指针是否为NULL?
- 25. 默认情况下是否急于提取JPA命名查询?
- 26. 默认情况下查找“require”的路径是什么?
- 27. 默认情况下是虚拟的成员函数吗?
- 28. 默认情况下,QNetworkManager是否接受压缩的回复?
- 29. 默认情况下枚举的实例是静态的吗?
- 30. Django:sessionid cookie何时设置? [默认情况下是否可用? ]
双精度实际上不是“常见”。最新的硬件支持它,但缺少GPGPU应用程序,它没有立即使用。它实际上将存储需求加倍,这意味着例如'dvec4'的顶点属性槽数是'vec4'的两倍。如果使用双精度,则用尽资源,内存和GLSL实现限制明显更快。除此之外,您也无法以双精度对纹理进行采样。只有流水线的*部分支持双精度,并且大部分是仰卧起坐数字的部分。 –