【发布时间】: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<>::epsilon只对浮点类型有意义,所以这段代码不可能都是 that 通用的...
标签: c++ exception math division infinity