2011-09-30 36 views
0

我想對任何類型T進行安全除法,我不想引發CPU/FPU異常,例如,如果浮點數除以零,它應該返回無窮大(+/-INF)。如何在不引發異常的情況下進行泛型除法

我應該寫我自己的功能嗎?或者是否有任何可以使用的標準C++函數?

如果我需要寫自己的功能,這個功能是否正確?

template<typename T> bool isSameSign(const T& a, const T& b) 
{  
    return ((((a)<0)==((b)<0))&&(((a)>0)==((b)>0))); 
} 

template<typename T> T safeDiv (const T& lhs, const T& rhs) 
{ 
    if(std::abs(rhs) > std::numeric_limits<T>::epsilon) 
    { 
     if(std::abs(lhs) > std::numeric_limits<T>::epsilon) 
     { 
      return lhs/rhs; 
     } 
     else 
     { 
      return std::numeric_limits<T>::quiet_NaN(); 
     } 
    } 
    else if(isSameSign<T>(lhs,rhs)) 
    { 
     return std::numeric_limits<T>::infinity(); 
    } 
    else 
    { 
     return -std::numeric_limits<T>::infinity(); 
    } 
} 
+0

可能的重複:http://stackoverflow.com/questions/4745311/c-division-by-0 – Pubby

+0

Float除以零已經在C++中返回無窮大。 – 2011-09-30 22:20:51

+0

@scott:我正在做泛型類的劃分,而不僅僅是浮點數 – uray

回答

1

如果一個浮點除以零,在數學上說,它是未定義的,而不是無窮大。原因是限制的法律。當你除以大於零的更小和更小的數字時,你傾向於接近正無窮大,並且當你除以更小和更小的負數時,趨於負無窮大......在數字線上,這些是相反的,而你不能將一件事情定義爲這兩種對立面。函數1/x因此未定義爲0.返回負值或正值無窮大將不正確。

+0

被零除僅僅是一個例子,我試圖通過小於epsilon的數字來處理這裏的分割 – uray

+1

@Zak,這就是爲什麼同時存在正數和負數的零。 – avakar

相關問題