CPU/FPU例外を発生させたくないタイプTに対して安全な除算を行いたいです。たとえば、浮動小数点数がゼロで除算された場合、無限大(+/-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();
}
}