2011-09-30 60 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

相关问题