与比较 floor(log10(abs(n))) 相比,相同数量级的更一般测试
More general test for same order of magnitude than comparing floor(log10(abs(n)))
我正在实施优化算法,并且对于不知道或不知道解决方案的下限和上限的情况有不同的启发式方法。
为了检查,我的第一种方法是简单地采用
if(abs(floor(log10(abs(LBD))) - floor(log10(abs(UBD)))) < 1 )
{ //(<1 e.g. for 6, 13)
//Bounds are sufficiently close for the serious stuff
}
else {
//We need some more black magic
}
但是这个requires previous checks要泛化为NAN,±INFINITY。
此外,在 LBD 为负而 UBD 为正的情况下,我们不能假设仅通过上述检查就可以向我们保证它们在任何地方都接近于相同的数量级。
是否有专门的方法来解决这个问题,还是我受困于这种黑客技术?
感谢 geza,我意识到没有 log10
也可以完成整个事情:
下面发布了一个可行的解决方案,并且在 ideone.
上发布了一个包含日志变体的 MWE
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
和 maxDiff
.
我正在实施优化算法,并且对于不知道或不知道解决方案的下限和上限的情况有不同的启发式方法。
为了检查,我的第一种方法是简单地采用
if(abs(floor(log10(abs(LBD))) - floor(log10(abs(UBD)))) < 1 )
{ //(<1 e.g. for 6, 13)
//Bounds are sufficiently close for the serious stuff
}
else {
//We need some more black magic
}
但是这个requires previous checks要泛化为NAN,±INFINITY。 此外,在 LBD 为负而 UBD 为正的情况下,我们不能假设仅通过上述检查就可以向我们保证它们在任何地方都接近于相同的数量级。
是否有专门的方法来解决这个问题,还是我受困于这种黑客技术?
感谢 geza,我意识到没有 log10
也可以完成整个事情:
下面发布了一个可行的解决方案,并且在 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
和 maxDiff
.