17_exp_exact_result_for_positive_one.patch (1510B)
1 diff --git a/e_exp.cpp b/e_exp.cpp 2 --- a/e_exp.cpp 3 +++ b/e_exp.cpp 4 @@ -91,16 +91,18 @@ ln2LO[2] ={ 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ 5 -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */ 6 invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ 7 P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ 8 P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ 9 P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ 10 P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ 11 P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */ 12 13 +static const double E = 2.7182818284590452354; /* e */ 14 + 15 static volatile double 16 huge = 1.0e+300, 17 twom1000= 9.33263618503218878990e-302; /* 2**-1000=0x01700000,0*/ 18 19 double 20 __ieee754_exp(double x) /* default IEEE double exp */ 21 { 22 double y,hi=0.0,lo=0.0,c,t,twopk; 23 @@ -122,16 +124,17 @@ __ieee754_exp(double x) /* default IEEE double exp */ 24 } 25 if(x > o_threshold) return huge*huge; /* overflow */ 26 if(x < u_threshold) return twom1000*twom1000; /* underflow */ 27 } 28 29 /* argument reduction */ 30 if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ 31 if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ 32 + if (x == 1.0) return E; 33 hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb; 34 } else { 35 k = (int)(invln2*x+halF[xsb]); 36 t = k; 37 hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */ 38 lo = t*ln2LO[0]; 39 } 40 STRICT_ASSIGN(double, x, hi - lo);