物理引擎:使用双精度还是单精度?

use*_*741 10 c++ opengl simulation floating-point floating-accuracy

我从零开始制作一个刚体物理引擎(用于教育目的),我想知道我是否应该为它选择单精度或双精度浮点数.

我将使用OpenGL对其进行可视化,并使用glm库来计算引擎内部以及可视化内容.惯例似乎是在任何地方使用浮动OpenGL,glm::vec3并且glm::vec4似乎在float内部使用.我也注意到有glm::dvec3,glm::dvec4但似乎没有人使用它.我该如何决定使用哪个?double似乎有意义,因为它在今天的硬件上具有更高的精度和几乎相同的性能(据我所知),但float 除了一些GLu的功能和一些GLFW 之外,其他一切似乎都在使用.

pip*_*289 9

这一切都取决于您的应用程序.你几乎已经理解了两者之间的权衡:

单精度

  • 不太准确
  • 即使在今天的硬件上也可以更快地进行计算.占用更少的内存,操作更快.从缓存优化等中获取更多信息

双精度

  • 更准确的
  • 计算速度较慢.

通常在图形应用程序中,浮动的精度很大,因为屏幕上的像素数和场景的缩放比例.在科学设置或较小规模的模拟中,您可能需要额外的精度.它也可能取决于您的硬件.例如,我为上网本上的刚体编码了一个基于物理的模拟,并且切换到平均10-15 FPS的浮点数,这在我的实现中几乎是FPS的两倍.

我的建议是,如果这是一个教育活动,请使用浮动并定位图形应用程序.如果您在学习中找到时间和个人经验,您需要双精度,然后朝这个方向前进.


Kei*_*ith 6

当然,一般规则首先是正确性,第二是表现吗?这意味着使用doubles除非你能说服自己使用floats 获得保真度.

要看的是坐标系相对于您打算建模的最小尺寸的一位有效尺寸.

例如,如果使用地球坐标,则100度可以在大约1E7米左右工作.IEEE 754浮点只有23位精度,因此相对精度仅为1E-7左右.因此坐标只能精确到1米左右.这可能会或可能不足以解决问题.

我从经验中学到了总是使用doubles进行物理和物理建模计算,但承认这不是一个普遍的要求.

当然,渲染应该使用double; 你可能希望这样做float.