2010-05-25 206 views
2

当找到双倍的平方根时,最好在0.0或MIN_DBL处将无效的非正输入钳位?由0.0(在下面double b我的例子可能最终由于浮点舍入误差和由于物理定律稍微稍微在游戏捏造为负。)C++双除0.0与DBL_MIN的比较

两个分裂和MIN_DBL产生同样的结果游戏因为1/0.01/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 

回答

2

当处理浮点数学时,“无限”和“有效无穷”是完全不同的。一旦数字停止有限,它往往会保持这种方式。因此,虽然lorentz_factor的值对于两种方法“有效”相同,但取决于您如何使用该值,以后的计算可能会有根本性的不同。例如,如果钳位到0,则例如保持无限,但如果钳位到某个非常小的数值,实际上将被计算。

所以这个答案很大程度上取决于你计划用这个值来做什么。

0

为什么不直接分配给INF直接lorentz_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()