如何在不引发异常的情况下进行泛型划分

时间:2011-09-30 22:14:48

标签: c++ exception math division infinity

我想对任何类型T进行安全除法,我不想提高CPU / FPU异常,例如,如果将float除以零,则应返回无穷大(+/- 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 个答案:

答案 0 :(得分:1)

如果浮点数除以零,从数学上讲,它是未定义的,而不是无穷大。原因是限制法则。当你除以越来越小的数字大于零时,你倾向于接近正无穷大,当你除以一个越来越小的负数时,你倾向于负无穷大......在一个数字线上那些是对立的,而你不能将这两者定义为对立面。因此,函数1 / x未定义为0.返回负或正无穷大将是不正确的。