我想對任何類型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();
}
}
可能的重複:http://stackoverflow.com/questions/4745311/c-division-by-0 – Pubby
Float除以零已經在C++中返回無窮大。 – 2011-09-30 22:20:51
@scott:我正在做泛型類的劃分,而不僅僅是浮點數 – uray