Более общий тест для того же порядка величины, что и сравнение пола (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
}

Но это требует предыдущих проверок быть преобразованным в NAN, ± INFINITY.
Кроме того, в случае, когда LBD отрицателен и UBD положителен, мы не можем предположить, что одна только вышеупомянутая проверка уверяет нас, что они где-то близко к тому, чтобы быть равного порядка величины.

Есть специальный подход к этому или я застрял с этой хакерской?

0

Решение

Благодаря Гезе я понял, что все это можно сделать без 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,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]