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/patches/17_exp_exact_result_for_positive_one.patch | |
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/patches/17_exp_exact_result_for_positive_one.patch')
-rw-r--r-- | modules/fdlibm/patches/17_exp_exact_result_for_positive_one.patch | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/modules/fdlibm/patches/17_exp_exact_result_for_positive_one.patch b/modules/fdlibm/patches/17_exp_exact_result_for_positive_one.patch new file mode 100644 index 000000000..9cda2beef --- /dev/null +++ b/modules/fdlibm/patches/17_exp_exact_result_for_positive_one.patch @@ -0,0 +1,40 @@ +diff --git a/modules/fdlibm/src/e_exp.cpp b/modules/fdlibm/src/e_exp.cpp +--- a/modules/fdlibm/src/e_exp.cpp ++++ b/modules/fdlibm/src/e_exp.cpp +@@ -91,16 +91,18 @@ ln2LO[2] ={ 1.90821492927058770002e-10 + -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */ + invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ + P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ + P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ + 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*/ + + double + __ieee754_exp(double x) /* default IEEE double exp */ + { + double y,hi=0.0,lo=0.0,c,t,twopk; +@@ -122,16 +124,17 @@ double + } + if(x > o_threshold) return huge*huge; /* overflow */ + if(x < u_threshold) return twom1000*twom1000; /* underflow */ + } + + /* 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]); + t = k; + hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */ + lo = t*ln2LO[0]; + } + STRICT_ASSIGN(double, x, hi - lo); |