求双精度的平方根反比时,将无效的非正输入钳制在 0.0 或 MIN_DBL 是否更好? (在我下面的示例中double b
,由于浮点舍入误差和物理定律在游戏中稍微有些捏造,最终可能会变成负数。)
除以 0.0 和 MIN_DBL 在游戏中产生相同的结果,因为1/0.0
和1/DBL_MIN
实际上是无穷大。我的直觉说 MIN_DBL 是更好的选择,但有任何情况下使用 0.0 吗?可能和乘法一样sqrt(0.0)
,因为它们是特殊情况,所以执行速度更快。1/0.0
1.#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