#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
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) {
bool test = -LBD<cutoff && UBD<cutoff;
if(test) return test;
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
}
bool closeEnoughLog(double LBD, double UBD) {
double dist = 42;
double sgn_LBD = sgn(LBD);
double sgn_UBD = sgn(UBD);
if(sgn_LBD == sgn_UBD) {
if(LBD < UBD) { // central assumption!
dist = max(log10(abs(UBD)), 0.0) - max(log10(abs(LBD)), 0.0);
// We take max here because -10 < n < 10 is considered close enough!
}
}
else if(sgn_UBD > 0) { // LBD <= 0
dist = log10(-LBD) + log10(UBD); // can be negative but that's ok
}
// if none of the above matches LBD >= UBD or any of the two is NAN
return (dist < 1);
}
int main() {
vector<double> LBD = {-INFINITY,-INFINITY,-100, -0.09, 0.09, NAN, -4, -2.4, 333, -40, -2.33};
vector<double> UBD = {+INFINITY, NAN, 100, 1, 1, NAN, 0.02, 2.4, 231, 40, -0.023};
vector<uint> desired = {0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1 };
printf("%7s %7s %3s %6s %5s\n", "LBD", "UBD", "log", "simple", "check");
for(auto i(0); i < desired.size(); ++i) {
printf("%7.2f %7.2f %3d %6d %5d\n", LBD[i], UBD[i], closeEnoughLog(LBD[i], UBD[i]), closeEnough(LBD[i], UBD[i]), desired[i] );
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGRvdWJsZSBzZ24oVCB2YWwpIHsKICAgIHJldHVybiBkb3VibGUoKFQoMCkgPCB2YWwpIC0gKHZhbCA8IFQoMCkpKS8odmFsID09IHZhbCk7Cn0KYm9vbCBjbG9zZUVub3VnaChkb3VibGUgTEJELCBkb3VibGUgVUJELCB1aW50IG1heE9yZGVyRGlmZiA9IDEsIHVpbnQgY3V0b2ZmT3JkZXIgPSAxKSB7CiAgZG91YmxlIHNnbl9MQkQgPSBzZ24oTEJEKTsKICBkb3VibGUgc2duX1VCRCA9IHNnbihVQkQpOwogIGRvdWJsZSBjdXRvZmYgPSBwb3coMTAsIGN1dG9mZk9yZGVyKTsKICBkb3VibGUgbWF4RGlmZiA9IHBvdygxMCwgbWF4T3JkZXJEaWZmKTsKICBpZihzZ25fTEJEID09IHNnbl9VQkQpIHsKICAJIGJvb2wgdGVzdCA9IC1MQkQ8Y3V0b2ZmICYmIFVCRDxjdXRvZmY7IAogIAkgaWYodGVzdCkgcmV0dXJuIHRlc3Q7CgkgcmV0dXJuIExCRDxVQkQgJiYgYWJzKFVCRCk8YWJzKExCRCkqbWF4RGlmZjsKICB9CiAgZWxzZSBpZihzZ25fVUJEID4gMCkgewogIAlyZXR1cm4gLUxCRDxjdXRvZmYgJiYgVUJEPGN1dG9mZjsKICB9CiAgLy8gaWYgbm9uZSBvZiB0aGUgYWJvdmUgbWF0Y2hlcyBMQkQgPj0gVUJEIG9yIGFueSBvZiB0aGUgdHdvIGlzIE5BTgp9CgoKYm9vbCBjbG9zZUVub3VnaExvZyhkb3VibGUgTEJELCBkb3VibGUgVUJEKSB7CiAgZG91YmxlIGRpc3QgPSA0MjsKICBkb3VibGUgc2duX0xCRCA9IHNnbihMQkQpOwogIGRvdWJsZSBzZ25fVUJEID0gc2duKFVCRCk7CiAgaWYoc2duX0xCRCA9PSBzZ25fVUJEKSB7CiAgICBpZihMQkQgPCBVQkQpIHsgLy8gY2VudHJhbCBhc3N1bXB0aW9uIQogICAgICBkaXN0ID0gbWF4KGxvZzEwKGFicyhVQkQpKSwgMC4wKSAtIG1heChsb2cxMChhYnMoTEJEKSksIDAuMCk7CiAgICAgIC8vIFdlIHRha2UgbWF4IGhlcmUgYmVjYXVzZSAtMTAgPCBuIDwgMTAgaXMgY29uc2lkZXJlZCBjbG9zZSBlbm91Z2ghCiAgICB9CiAgfQogIGVsc2UgaWYoc2duX1VCRCA+IDApIHsgLy8gTEJEIDw9IDAKICAgIGRpc3QgPSBsb2cxMCgtTEJEKSArIGxvZzEwKFVCRCk7IC8vIGNhbiBiZSBuZWdhdGl2ZSBidXQgdGhhdCdzIG9rCiAgfQogIC8vIGlmIG5vbmUgb2YgdGhlIGFib3ZlIG1hdGNoZXMgTEJEID49IFVCRCBvciBhbnkgb2YgdGhlIHR3byBpcyBOQU4KICByZXR1cm4gKGRpc3QgPCAxKTsKfQoKaW50IG1haW4oKSB7CiAgdmVjdG9yPGRvdWJsZT4gTEJEID0gey1JTkZJTklUWSwtSU5GSU5JVFksLTEwMCwgLTAuMDksIDAuMDksIE5BTiwgLTQsIC0yLjQsIDMzMywgLTQwLCAtMi4zM307CiAgdmVjdG9yPGRvdWJsZT4gVUJEID0geytJTkZJTklUWSwgTkFOLCAgICAgIDEwMCwgMSwgICAgIDEsICAgIE5BTiwgMC4wMiwgICAyLjQsICAyMzEsIDQwLCAtMC4wMjN9OwogIHZlY3Rvcjx1aW50PiBkZXNpcmVkID0gezAsICAgICAgIDAsICAgICAgICAwLCAgIDEsICAgICAxLCAgICAwLCAgIDEsICAgICAxLCAgICAwLCAgIDAsIDEgfTsKICBwcmludGYoIiU3cyAlN3MgJTNzICU2cyAlNXNcbiIsICJMQkQiLCAiVUJEIiwgImxvZyIsICJzaW1wbGUiLCAiY2hlY2siKTsKICBmb3IoYXV0byBpKDApOyBpIDwgZGVzaXJlZC5zaXplKCk7ICsraSkgewogIAlwcmludGYoIiU3LjJmICU3LjJmICUzZCAlNmQgJTVkXG4iLCBMQkRbaV0sIFVCRFtpXSwgY2xvc2VFbm91Z2hMb2coTEJEW2ldLCBVQkRbaV0pLCBjbG9zZUVub3VnaChMQkRbaV0sIFVCRFtpXSksIGRlc2lyZWRbaV0gKTsKICB9CiAgCiAgcmV0dXJuIDA7Cn0=