【发布时间】:2011-02-23 13:20:14
【问题描述】:
当求双精度的平方根的反比时,最好将无效的非正输入钳制在 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【问题讨论】:
标签: c++ double msvcrt infinity divide-by-zero