【问题标题】:how to do generic division without raising exception如何在不引发异常的情况下进行通用除法
【发布时间】:2011-09-30 22:14:48
【问题描述】:

我想对任何类型的 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();
    }
}

【问题讨论】:

  • 浮点除以零已经在 C++ 中返回无穷大。
  • @scott : 我正在做通用类型的除法,而不仅仅是浮动
  • @uray 你的意思是整数还是别的什么?
  • @uray : numeric_limits&lt;&gt;::epsilon 只对浮点类型有意义,所以这段代码不可能都是 that 通用的...

标签: c++ exception math division infinity


【解决方案1】:

如果浮点数除以零,从数学上讲,它是未定义的,而不是无穷大。原因是极限法则。当你除以一个越来越小的大于零的数时,你趋向于正无穷大,当你除以一个越来越小的负数时,你趋向于负无穷大......在数轴上,它们是相反的,你不能将一件事定义为这两个对立面。因此,函数 1/x 在 0 处未定义。返回负无穷或正无穷是不正确的。

【讨论】:

  • 除以零只是一个例子,我在这里尝试处理小于 epsilon 的除数
  • @Zak,这就是为什么同时存在正零和负零的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多