找到 double 的平方根的倒数时,将无效的非正输入限制在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

最佳答案

在处理浮点数学时,“无穷大”和“有效无穷大”是完全不同的。一旦数字不再是有限的,就倾向于保持这种状态。因此,尽管两种方法的lorentz_factor值“有效”相同,但取决于您使用该值的方式,以后的计算可能会大不相同。例如,如果钳制为0,则sqrt(lorentz_factor)保持无限,但如果钳制为非常小的数字,则ojit_code实际上将被计算。

因此,答案将在很大程度上取决于您确定该值后打算采取的措施。

关于c++ - C++用0.0除以DBL_MIN的两倍,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2902511/

10-09 19:26