找到 double 的平方根的倒数时,将无效的非正输入限制在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
最佳答案
在处理浮点数学时,“无穷大”和“有效无穷大”是完全不同的。一旦数字不再是有限的,就倾向于保持这种状态。因此,尽管两种方法的lorentz_factor
值“有效”相同,但取决于您使用该值的方式,以后的计算可能会大不相同。例如,如果钳制为0,则sqrt(lorentz_factor)
保持无限,但如果钳制为非常小的数字,则ojit_code实际上将被计算。
因此,答案将在很大程度上取决于您确定该值后打算采取的措施。
关于c++ - C++用0.0除以DBL_MIN的两倍,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2902511/