2010-05-25 59 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()