как сделать общее деление без исключения

Я хочу сделать безопасное деление для любого типа 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();
    }
}

person uray    schedule 30.09.2011    source источник
comment
Возможный дубликат: stackoverflow.com/questions/4745311/c-division-by-0   -  person Pubby    schedule 01.10.2011
comment
Деление числа с плавающей запятой на ноль уже возвращает бесконечность в C++.   -  person    schedule 01.10.2011
comment
@scott: я делаю общий тип деления, а не просто плаваю   -  person uray    schedule 01.10.2011
comment
@uray ты имеешь в виду целые числа или что-то еще?   -  person Pubby    schedule 01.10.2011
comment
@uray: numeric_limits<>::epsilon имеет смысл только для типов с плавающей запятой, поэтому этот код не может быть полностью этим универсальным...   -  person ildjarn    schedule 01.10.2011
comment
@ildjarn: numeric_limits‹› может быть расширен/специализирован для другого типа, кроме плавающей запятой   -  person uray    schedule 01.10.2011
comment
Что вообще означает деление деления для любого типа Т? Мой класс пути имеет path path::operator/(const char*). Позволяет использовать причудливые выражения, такие как RootDir/"temp", но это точно не деление. А если серьезно, загляните на en.wikipedia.org/wiki/Division_ring — там много разумных математических типы, для которых деление весьма нетривиально.   -  person MSalters    schedule 01.10.2011
comment
Кроме того, даже комплексные числа (очень разумный тип для деления) нельзя сравнивать с нулем, как это делаете вы. У них даже нет нет вывески. И поэтому у них нет +INF и -INF. (+INF, 0) и (0, +INF), да, а также (+INF,+INF).   -  person MSalters    schedule 01.10.2011
comment
@uray: может быть и есть две разные вещи. ;-]   -  person ildjarn    schedule 01.10.2011


Ответы (1)


Если число с плавающей запятой делится на ноль, с математической точки зрения это неопределенность, а не бесконечность. Причина в законе пределов. Когда вы делите на все меньшее и меньшее число, большее нуля, вы стремитесь к положительной бесконечности, а когда вы делите на все меньшее и меньшее отрицательное число, вы стремитесь к отрицательной бесконечности... На числовой прямой это противоположности, и вы нельзя определить одну вещь как обе эти противоположности. Таким образом, функция 1/x не определена в 0. Возвращать отрицательную или положительную бесконечность было бы неправильно.

person Zak    schedule 30.09.2011
comment
деление на ноль - это просто пример, здесь я пытаюсь обработать деление на число меньше эпсилон - person uray; 01.10.2011
comment
@ Зак, вот почему есть как положительный, так и отрицательный ноль. - person avakar; 01.10.2011