Я хочу сделать безопасное деление для любого типа T, что я не хочу вызывать исключение CPU/FPU, например, если число с плавающей запятой делится на ноль, оно должно возвращать бесконечность (+/-INF).
Должен ли я написать свою собственную функцию? или есть ли стандартная функция С++, которую я могу использовать?
если мне нужно написать свою собственную функцию, подходит ли эта функция?
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();
}
}
numeric_limits<>::epsilon
имеет смысл только для типов с плавающей запятой, поэтому этот код не может быть полностью этим универсальным... - person ildjarn   schedule 01.10.2011path path::operator/(const char*)
. Позволяет использовать причудливые выражения, такие какRootDir/"temp"
, но это точно не деление. А если серьезно, загляните на en.wikipedia.org/wiki/Division_ring — там много разумных математических типы, для которых деление весьма нетривиально. - person MSalters   schedule 01.10.2011