感谢 geza,我意识到整个事情都可以在没有以下内容的情况下完成log10
:一个工作解决方案发布在下面,一个 MWE 包括发布在ideone上的日志变体。
template <typename T> double sgn(T val) {
return double((T(0) < val) - (val < T(0)))/(val == val);
}
bool closeEnough(double LBD, double UBD, uint maxOrderDiff = 1, uint cutoffOrder = 1) {
double sgn_LBD = sgn(LBD);
double sgn_UBD = sgn(UBD);
double cutoff = pow(10, cutoffOrder);
double maxDiff = pow(10, maxOrderDiff);
if(sgn_LBD == sgn_UBD) {
if(abs(LBD)<cutoff && abs(UBD)<cutoff) return true;
return LBD<UBD && abs(UBD)<abs(LBD)*maxDiff;
}
else if(sgn_UBD > 0) {
return -LBD<cutoff && UBD<cutoff;
}
// if none of the above matches LBD >= UBD or any of the two is NAN
}
作为奖励,它可以截断,因此如果两个边界都在其中,[-10^cutoffOrder,+10^cutoffOrder]
则它们被认为足够接近!pow 计算也可能是不必要的,但至少在我的情况下,此检查不在关键代码部分中。如果是这样,我想你可以硬编码cutoff
and maxDiff
。