在计算浮点向量的点积时,灾难性的取消是一个问题吗?如果是这样,它通常如何解决?

Nic*_*vac 16 c++ math floating-point physics

我正在用C++编写一个物理模拟器,我担心的是健壮性.我已经读过,当计算两个几乎相等的数量的差值时,浮点运算会发生灾难性的消除.我想到,当计算两个几乎正交矢量的点积时,这可能发生在模拟器中.但是,我所看到的参考文献仅讨论通过重写相关方程来解决问题(例如,可以重写二次公式以消除问题) - 但这在计算点积时似乎不适用?我想我有兴趣知道这是否是物理引擎中的一个问题,以及它是如何解决的.

jan*_*neb 13

一个常见的技巧是使累加器变量成为一种精度高于向量本身的类型.

或者,可以在对术语求和时使用Kahan求和.

另一种方法是使用各种阻塞点积算法而不是规范算法.

当然可以结合上述两种方法.

请注意,以上是点产品的一般错误行为,而不是特别灾难性的取消.


Ton*_*nyK 5

你在评论中说你必须计算x1*x2 + y1*y2,其中所有变量都是浮点数.因此,如果以双精度进行计算,则完全没有精度,因为双精度的精度比浮点数高两倍(假设您的目标使用IEEE-754).

具体来说:让变量xx, yy代表的实数.让它们成为产品,让它成为双精度乘法的结果.然后在所有情况下,是由实数表示.floatx, yxxyyxyx * yxxyyxy