#include <iostream>
#include <cmath>
#include <cfenv>
#include <cerrno>
#include <cstring>
using namespace std;
void throw_fe()
{
if (errno) throw runtime_error(strerror(errno));
if(fetestexcept(FE_DIVBYZERO)) throw runtime_error("FE_DIVBYZERO");
if(fetestexcept(FE_INEXACT)) throw runtime_error("FE_INEXACT");
if(fetestexcept(FE_INVALID)) throw runtime_error("FE_INVALID");
if(fetestexcept(FE_OVERFLOW)) throw runtime_error("FE_OVERFLOW");
if(fetestexcept(FE_UNDERFLOW)) throw runtime_error("FE_UNDERFLOW");
}
double Pow(double x, double y)
{
errno = 0;
feclearexcept(FE_ALL_EXCEPT);
double z = pow(x,y);
throw_fe();
return z;
}
double Sqrt(double x)
{
errno = 0;
feclearexcept(FE_ALL_EXCEPT);
double z = sqrt(x);
throw_fe();
return z;
}
double Log(double x)
{
errno = 0;
feclearexcept(FE_ALL_EXCEPT);
double z = log(x);
throw_fe();
return z;
}
int main()
{
try {
double q = Sqrt(-2) + Pow(1e20,1e20);
printf("log(0) = %f\n", q);
} catch(exception&e)
{
cout << "Catch: " << e.what() << endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjZmVudj4KI2luY2x1ZGUgPGNlcnJubz4KI2luY2x1ZGUgPGNzdHJpbmc+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCB0aHJvd19mZSgpCnsKICAgIGlmIChlcnJubykgdGhyb3cgcnVudGltZV9lcnJvcihzdHJlcnJvcihlcnJubykpOwogICAgaWYoZmV0ZXN0ZXhjZXB0KEZFX0RJVkJZWkVSTykpICAgICB0aHJvdyBydW50aW1lX2Vycm9yKCJGRV9ESVZCWVpFUk8iKTsKICAgIGlmKGZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkgICAgICAgdGhyb3cgcnVudGltZV9lcnJvcigiRkVfSU5FWEFDVCIpOwogICAgaWYoZmV0ZXN0ZXhjZXB0KEZFX0lOVkFMSUQpKSAgICAgICB0aHJvdyBydW50aW1lX2Vycm9yKCJGRV9JTlZBTElEIik7CiAgICBpZihmZXRlc3RleGNlcHQoRkVfT1ZFUkZMT1cpKSAgICAgIHRocm93IHJ1bnRpbWVfZXJyb3IoIkZFX09WRVJGTE9XIik7CiAgICBpZihmZXRlc3RleGNlcHQoRkVfVU5ERVJGTE9XKSkgICAgIHRocm93IHJ1bnRpbWVfZXJyb3IoIkZFX1VOREVSRkxPVyIpOwp9CgoKZG91YmxlIFBvdyhkb3VibGUgeCwgZG91YmxlIHkpCnsKICAgIGVycm5vID0gMDsKICAgIGZlY2xlYXJleGNlcHQoRkVfQUxMX0VYQ0VQVCk7CiAgICBkb3VibGUgeiA9IHBvdyh4LHkpOwogICAgdGhyb3dfZmUoKTsKICAgIHJldHVybiB6Owp9Cgpkb3VibGUgU3FydChkb3VibGUgeCkKewogICAgZXJybm8gPSAwOwogICAgZmVjbGVhcmV4Y2VwdChGRV9BTExfRVhDRVBUKTsKICAgIGRvdWJsZSB6ID0gc3FydCh4KTsKICAgIHRocm93X2ZlKCk7CiAgICByZXR1cm4gejsKfQoKZG91YmxlIExvZyhkb3VibGUgeCkKewogICAgZXJybm8gPSAwOwogICAgZmVjbGVhcmV4Y2VwdChGRV9BTExfRVhDRVBUKTsKICAgIGRvdWJsZSB6ID0gbG9nKHgpOwogICAgdGhyb3dfZmUoKTsKICAgIHJldHVybiB6Owp9CgoKaW50IG1haW4oKQp7CiAgICB0cnkgewogICAgICAgIGRvdWJsZSBxID0gU3FydCgtMikgKyBQb3coMWUyMCwxZTIwKTsKICAgICAgICBwcmludGYoImxvZygwKSA9ICVmXG4iLCBxKTsKICAgIH0gY2F0Y2goZXhjZXB0aW9uJmUpCiAgICB7CiAgICAgICAgY291dCA8PCAiQ2F0Y2g6ICIgPDwgZS53aGF0KCkgIDw8IGVuZGw7CiAgICB9Cn0K