summaryrefslogtreecommitdiffstats
path: root/modules/fdlibm/patches/17_exp_exact_result_for_positive_one.patch
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2019-11-15 15:17:37 +0100
committerwolfbeast <mcwerewolf@wolfbeast.com>2019-11-15 15:17:37 +0100
commit59f4de4c45e126f5f20633808ce28548d5879b16 (patch)
tree2db061bafcebcac423ca7deeb152435c44944419 /modules/fdlibm/patches/17_exp_exact_result_for_positive_one.patch
parent5e902a4a9a25a9e151b5d3945c68517bc0c73139 (diff)
downloadUXP-59f4de4c45e126f5f20633808ce28548d5879b16.tar
UXP-59f4de4c45e126f5f20633808ce28548d5879b16.tar.gz
UXP-59f4de4c45e126f5f20633808ce28548d5879b16.tar.lz
UXP-59f4de4c45e126f5f20633808ce28548d5879b16.tar.xz
UXP-59f4de4c45e126f5f20633808ce28548d5879b16.zip
Issue #1291 - Part 4: Update patch files
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.patch40
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);