Я реализую алгоритм оптимизации и использую разные эвристики для случаев, когда неизвестны или существенно различаются нижняя и верхняя границы решения или нет.
Чтобы проверить, мой первый подход будет просто принимать
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
}
Но это требует предыдущих проверок быть преобразованным в NAN, ± INFINITY.
Кроме того, в случае, когда LBD отрицателен и UBD положителен, мы не можем предположить, что одна только вышеупомянутая проверка уверяет нас, что они где-то близко к тому, чтобы быть равного порядка величины.
Есть специальный подход к этому или я застрял с этой хакерской?
Благодаря Гезе я понял, что все это можно сделать без 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
а также maxDiff
,
Других решений пока нет …