как сделать общее деление без исключения исключения - PullRequest
0 голосов
/ 01 октября 2011

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

1 Ответ

1 голос
/ 01 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...