2

求双精度的平方根反比时,将无效的非正输入钳制在 0.0 或 MIN_DBL 是否更好? (在我下面的示例中double b,由于浮点舍入误差和物理定律在游戏中稍微有些捏造,最终可能会变成负数。)

除以 0.0 和 MIN_DBL 在游戏中产生相同的结果,因为1/0.01/DBL_MIN实际上是无穷大。我的直觉说 MIN_DBL 是更好的选择,但有任何情况下使用 0.0 吗?可能和乘法一样sqrt(0.0),因为它们是特殊情况,所以执行速度更快。1/0.01.#INF000000000000

double b = 1 - v.length_squared()/(c*c);

#ifdef CLAMP_BY_0
if (b < 0.0) b = 0.0;
#endif

#ifdef CLAMP_BY_DBL_MIN
if (b <= 0.0) b = DBL_MIN;
#endif

double lorentz_factor = 1/sqrt(b);

MSVC中的双除法:

1/0.0 = 1.#INF000000000000
1/DBL_MIN = 4.4942328371557898e+307
4

2 回答 2

2

在处理浮点数学时,“无穷大”和“有效无穷大”是完全不同的。一旦一个数字不再是有限的,它往往会保持这种状态。因此,虽然lorentz_factor两种方法的值“有效地”相同,但取决于您如何使用该值,但以后的计算可能会完全不同。 sqrt(lorentz_factor)例如,如果你钳制到 0,它仍然是无限的,但如果你钳制到一些非常非常小的数字,它实际上会被计算出来。

因此,答案在很大程度上取决于您在锁定该值后打算如何处理该值。

于 2010-05-25T07:37:30.297 回答
0

为什么不直接分配INFlorentz_factor,避免sqrt调用和除法?

double lorentz_factor;
if (b <= 0.0) 
    lorentz_factor = std::numeric_limits<double>::infinity();
else
    lorentz_factor = 1/sqrt(b);
  • 你需要这样做#include <limits>
  • 如果你需要的话,你也可以使用::max()代替。::infinity()
于 2010-05-25T07:25:38.487 回答