2017-08-11 6 views
0

Je mets en œuvre un algorithme d'optimisation et ai des heuristiques différentes pour les cas où les limites inférieure et supérieure de la solution sont inconnues ou non ne pas.Test plus général du même ordre de grandeur que comparer étage (log10 (abs (n)))

Pour vérifier, ma première approche serait tout simplement en prenant

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 
} 

Mais ce requires previous checks à gerneralized à NAN, ± INFINITY. De plus, dans le cas où LBD est négatif et positif à l'UBD, nous ne pouvons pas supposer que le contrôle ci-dessus seul nous assure qu'ils sont presque tous d'un ordre de grandeur.

Y a-t-il une approche dédiée à cela ou suis-je coincé avec ce hackery?

+0

Pourquoi utilisez-vous log10 ici? Est-ce que 'LBD <= UBD && LBD * 10> UBD' ne serait pas meilleur? – geza

+0

@geza Numéros négatifs! Mais merci de le souligner, j'ai eu un problème similaire avec ma formulation – mrclng

+1

Bien sûr, vous devez prendre soin des nombres négatifs. Mon point est qu'un simple multiplier/comparer est beaucoup-beaucoup plus rapide que log10 – geza

Répondre

0

Merci à Geza j'ai réalisé que tout THW peut se faire sans l'log10: Une solution de travail est affiché ci-dessous, et un MWE y compris la variante de journal affiché sur 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 
} 

En prime, il peut prendre des seuils, si les deux bornes se trouvent dans [-10^cutoffOrder,+10^cutoffOrder] ils sont considérés comme assez proches! Le calcul de pow peut également être inutile, mais au moins dans mon cas, cette vérification n'est pas dans une section de code critique. Si ce serait, je suppose que vous pourriez simplement coder le cutoff et maxDiff.