diff options
author | Matt A. Tobin <email@mattatobin.com> | 2019-11-15 17:37:54 -0500 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2019-11-15 17:37:54 -0500 |
commit | 556349010e01d0a3b7896f858d503781ea837b46 (patch) | |
tree | f003183732dc3cda4ad880407880da282ca4b0c5 /modules/fdlibm/src/e_exp.cpp | |
parent | f3d462c6049bd2f35571c2a0e2a7c4df4f3ca81c (diff) | |
parent | 3492ad65236209e741ca3641789efeaa22a6b8a4 (diff) | |
download | UXP-556349010e01d0a3b7896f858d503781ea837b46.tar UXP-556349010e01d0a3b7896f858d503781ea837b46.tar.gz UXP-556349010e01d0a3b7896f858d503781ea837b46.tar.lz UXP-556349010e01d0a3b7896f858d503781ea837b46.tar.xz UXP-556349010e01d0a3b7896f858d503781ea837b46.zip |
Merge branch 'master' into mailnews-work
Diffstat (limited to 'modules/fdlibm/src/e_exp.cpp')
-rw-r--r-- | modules/fdlibm/src/e_exp.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/modules/fdlibm/src/e_exp.cpp b/modules/fdlibm/src/e_exp.cpp index b31979134..92af819ce 100644 --- a/modules/fdlibm/src/e_exp.cpp +++ b/modules/fdlibm/src/e_exp.cpp @@ -96,6 +96,8 @@ P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */ +static const double E = 2.7182818284590452354; /* e */ + static volatile double huge = 1.0e+300, twom1000= 9.33263618503218878990e-302; /* 2**-1000=0x01700000,0*/ @@ -127,6 +129,7 @@ __ieee754_exp(double x) /* default IEEE double exp */ /* argument reduction */ if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ + if (x == 1.0) return E; hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb; } else { k = (int)(invln2*x+halF[xsb]); @@ -144,9 +147,9 @@ __ieee754_exp(double x) /* default IEEE double exp */ /* x is now in primary range */ t = x*x; if(k >= -1021) - INSERT_WORDS(twopk,0x3ff00000+(k<<20), 0); + INSERT_WORDS(twopk,((u_int32_t)(0x3ff+k))<<20, 0); else - INSERT_WORDS(twopk,0x3ff00000+((k+1000)<<20), 0); + INSERT_WORDS(twopk,((u_int32_t)(0x3ff+(k+1000)))<<20, 0); c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); if(k==0) return one-((x*c)/(c-2.0)-x); else y = one-((lo-(x*c)/(2.0-c))-hi); |