directx local space 坐标浮点精度

directx local space coordinates float accuracy

我对本地 space 坐标系有点困惑。假设我在本地有一个复杂的对象space。我知道什么时候我想把它放在世界上 space 我必须将它与 Scale、Rotate、Translate 矩阵相乘。但问题是局部坐标仅在 -1.0f 到 1.0f 之间,当我想要像 (1/500,1/100,1/100) 这样的顶点时,事情将不起作用,由于浮动,一切都会变成 0精度问题。 现在对我来说唯一的解决方案是将它们分成许多本地 space 系统和 ProjectView,每个单独地把它们放在一起。这似乎不是解决问题的正确方法。我查了很多书,但其中 none 提到了这个问题。我很想知道怎么解决。

when I want to have vertex like (1/500,1/100,1/100) things will not work

是什么让你这么想的?浮点精度问题并不意味着如果不能准确表示某些东西就会强制为 0。这只是意味着,它将强制转换为最接近预期数字的浮点数。

这与写下来非常相似,例如,最多 6 位有效小数位的 3/9:0.33334 – 它不会强制为 0。浮点数也是如此。

现在您可能熟悉科学计数法:x·10^y – 这本质上是十进制浮点数,一个尾数 x 和一个指数 y,它本质上指定了数量级。在二进制浮点数中,它变为 x·2^y。在任何一种情况下,有效数字都在尾数中。典型的浮点数(在 OpenGL 中)有一个 23 位的尾数,归结为 22 个有效二进制数字(大约 7 个十进制数字)。

I really want to know how to solve it.

浮点数的真正麻烦在于,如果您必须在很大的数量级范围内混合和合并数字。只要数字的数量级相似,一切都只发生在尾数上。最后 [-1, 1] 范围内的数量级变化不会伤害你;哎呀,这可以通过“规范化”浮点值然后简单地 dropping 指数来完成。


推荐阅读:http://floating-point-gui.de/


更新

另外一件事:如果您使用 C 等语言编写 1/500,那么您将执行 整数除法 ,这当然会向下舍入到 0。如果您希望这是一个浮点运算,您要么必须编写浮点文字,要么强制转换为浮点数,即

1./500.

(float)1/(float)500

请注意,将其中一个操作数转换为浮点数足以使其成为 浮点除法