#include <iostream>
#include <limits>
#include <cmath>
using namespace std;
double large_exp_quot2(
double const eNum,
double const eDenom,
int & scale) {
double const eExponent = eNum - eDenom;
double tExponent = eExponent * log10(exp(1));
scale = 0;
if (tExponent >= numeric_limits<double>::max_exponent10) {
do {
tExponent -= numeric_limits<double>::max_exponent10;
scale += numeric_limits<double>::max_exponent10;
} while(tExponent >= numeric_limits<double>::max_exponent10);
return pow(10, tExponent);
}
else if (tExponent <= numeric_limits<double>::min_exponent10) {
do {
tExponent -= numeric_limits<double>::min_exponent10;
scale += numeric_limits<double>::min_exponent10;
} while (tExponent <= numeric_limits<double>::min_exponent10);
return pow(10, tExponent);
}
return exp(eExponent);
}
double large_exp_quot(
double eNum,
double eDenom,
unsigned int const critical = 200) {
if (abs(eNum - eDenom) > critical) {
throw out_of_range{"That won't work, resulting exponent is too large"};
}
unsigned int eDivisor = 1;
while (abs(eNum) > critical or abs(eDenom) > critical) {
eNum /= 2;
eDenom /= 2;
eDivisor *= 2;
}
return pow(exp(eNum) / exp(eDenom), eDivisor);
}
int main() {
int scale;
double const result = large_exp_quot2(90000, 100, scale);
double const exponent = round(log10(result));
scale += exponent;
cout
<< "exp(90000) / exp(100) = "
<< (result / pow(10, exponent)) << " scaled by 10^" << scale << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKZG91YmxlIGxhcmdlX2V4cF9xdW90MigKCWRvdWJsZSBjb25zdCBlTnVtLAoJZG91YmxlIGNvbnN0IGVEZW5vbSwKCWludCAmIHNjYWxlKSB7CiAgZG91YmxlIGNvbnN0IGVFeHBvbmVudCA9IGVOdW0gLSBlRGVub207CiAgZG91YmxlIHRFeHBvbmVudCA9IGVFeHBvbmVudCAqIGxvZzEwKGV4cCgxKSk7CiAgc2NhbGUgPSAwOwogIGlmICh0RXhwb25lbnQgPj0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2V4cG9uZW50MTApIHsKICAJZG8gewogIAkgIHRFeHBvbmVudCAtPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZXhwb25lbnQxMDsKICAJICBzY2FsZSArPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZXhwb25lbnQxMDsKICAJfSB3aGlsZSh0RXhwb25lbnQgPj0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2V4cG9uZW50MTApOwogIAlyZXR1cm4gcG93KDEwLCB0RXhwb25lbnQpOwogIH0KICBlbHNlIGlmICh0RXhwb25lbnQgPD0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluX2V4cG9uZW50MTApIHsKICAJZG8gewogICAgICB0RXhwb25lbnQgLT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluX2V4cG9uZW50MTA7CiAgICAgIHNjYWxlICs9IG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1pbl9leHBvbmVudDEwOwogIAl9IHdoaWxlICh0RXhwb25lbnQgPD0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluX2V4cG9uZW50MTApOwogICAgcmV0dXJuIHBvdygxMCwgdEV4cG9uZW50KTsKICB9CiAgcmV0dXJuIGV4cChlRXhwb25lbnQpOwp9Cgpkb3VibGUgbGFyZ2VfZXhwX3F1b3QoCiAgICBkb3VibGUgZU51bSwKICAgIGRvdWJsZSBlRGVub20sCiAgICB1bnNpZ25lZCBpbnQgY29uc3QgY3JpdGljYWwgPSAyMDApIHsKICBpZiAoYWJzKGVOdW0gLSBlRGVub20pID4gY3JpdGljYWwpIHsKICAJdGhyb3cgb3V0X29mX3JhbmdleyJUaGF0IHdvbid0IHdvcmssIHJlc3VsdGluZyBleHBvbmVudCBpcyB0b28gbGFyZ2UifTsKICB9CiAgdW5zaWduZWQgaW50IGVEaXZpc29yID0gMTsKICB3aGlsZSAoYWJzKGVOdW0pID4gY3JpdGljYWwgb3IgYWJzKGVEZW5vbSkgPiBjcml0aWNhbCkgewogICAgZU51bSAvPSAyOwogICAgZURlbm9tIC89IDI7CiAgICBlRGl2aXNvciAqPSAyOwogIH0KICByZXR1cm4gcG93KGV4cChlTnVtKSAvIGV4cChlRGVub20pLCBlRGl2aXNvcik7Cn0KCmludCBtYWluKCkgewoJaW50IHNjYWxlOwoJZG91YmxlIGNvbnN0IHJlc3VsdCA9IGxhcmdlX2V4cF9xdW90Mig5MDAwMCwgMTAwLCBzY2FsZSk7Cglkb3VibGUgY29uc3QgZXhwb25lbnQgPSByb3VuZChsb2cxMChyZXN1bHQpKTsKCXNjYWxlICs9IGV4cG9uZW50OwoJY291dAoJICA8PCAiZXhwKDkwMDAwKSAvIGV4cCgxMDApICA9ICAiCgkgIDw8IChyZXN1bHQgLyBwb3coMTAsIGV4cG9uZW50KSkgPDwgIiBzY2FsZWQgYnkgMTBeIiA8PCBzY2FsZSA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=