0

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();
    }
}
4

1 に答える 1

1

float がゼロで除算された場合、数学的に言えば、無限ではなく未定義です。その理由は極限の法則です。ゼロより大きい小さな数で割ると、正の無限大に近づく傾向があり、さらに小さな負の数で割ると、負の無限大に近づく傾向があります.... 数直線上では、これらは反対であり、あなたは1 つのことをこれらの反対の両方として定義することはできません。したがって、関数 1/x は 0 では未定義です。負または正の無限大を返すことは正しくありません。

于 2011-09-30T22:20:54.933 に答える