fork download
  1. #include <iostream>
  2. #include <limits>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6.  
  7. double large_exp_quot2(
  8. double const eNum,
  9. double const eDenom,
  10. int & scale) {
  11. double const eExponent = eNum - eDenom;
  12. double tExponent = eExponent * log10(exp(1));
  13. scale = 0;
  14. if (tExponent >= numeric_limits<double>::max_exponent10) {
  15. do {
  16. tExponent -= numeric_limits<double>::max_exponent10;
  17. scale += numeric_limits<double>::max_exponent10;
  18. } while(tExponent >= numeric_limits<double>::max_exponent10);
  19. return pow(10, tExponent);
  20. }
  21. else if (tExponent <= numeric_limits<double>::min_exponent10) {
  22. do {
  23. tExponent -= numeric_limits<double>::min_exponent10;
  24. scale += numeric_limits<double>::min_exponent10;
  25. } while (tExponent <= numeric_limits<double>::min_exponent10);
  26. return pow(10, tExponent);
  27. }
  28. return exp(eExponent);
  29. }
  30.  
  31. double large_exp_quot(
  32. double eNum,
  33. double eDenom,
  34. unsigned int const critical = 200) {
  35. if (abs(eNum - eDenom) > critical) {
  36. throw out_of_range{"That won't work, resulting exponent is too large"};
  37. }
  38. unsigned int eDivisor = 1;
  39. while (abs(eNum) > critical or abs(eDenom) > critical) {
  40. eNum /= 2;
  41. eDenom /= 2;
  42. eDivisor *= 2;
  43. }
  44. return pow(exp(eNum) / exp(eDenom), eDivisor);
  45. }
  46.  
  47. int main() {
  48. int scale;
  49. double const result = large_exp_quot2(90000, 100, scale);
  50. double const exponent = round(log10(result));
  51. scale += exponent;
  52. cout
  53. << "exp(90000) / exp(100) = "
  54. << (result / pow(10, exponent)) << " scaled by 10^" << scale << endl;
  55. return 0;
  56. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
exp(90000) / exp(100)  =  1.18556 scaled by 10^39043