| Index: src/third_party/fdlibm/fdlibm.js
|
| diff --git a/src/third_party/fdlibm/fdlibm.js b/src/third_party/fdlibm/fdlibm.js
|
| index 022d1d6f182d11c1fb9d17347497790aab8d5d12..b9c9b3375f587cee21836ebfb5eccd289030d6fa 100644
|
| --- a/src/third_party/fdlibm/fdlibm.js
|
| +++ b/src/third_party/fdlibm/fdlibm.js
|
| @@ -757,187 +757,6 @@ function MathTanh(x) {
|
| return (x >= 0) ? z : -z;
|
| }
|
|
|
| -// ES6 draft 09-27-13, section 20.2.2.21.
|
| -// Return the base 10 logarithm of x
|
| -//
|
| -// Method :
|
| -// Let log10_2hi = leading 40 bits of log10(2) and
|
| -// log10_2lo = log10(2) - log10_2hi,
|
| -// ivln10 = 1/log(10) rounded.
|
| -// Then
|
| -// n = ilogb(x),
|
| -// if(n<0) n = n+1;
|
| -// x = scalbn(x,-n);
|
| -// log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x))
|
| -//
|
| -// Note 1:
|
| -// To guarantee log10(10**n)=n, where 10**n is normal, the rounding
|
| -// mode must set to Round-to-Nearest.
|
| -// Note 2:
|
| -// [1/log(10)] rounded to 53 bits has error .198 ulps;
|
| -// log10 is monotonic at all binary break points.
|
| -//
|
| -// Special cases:
|
| -// log10(x) is NaN if x < 0;
|
| -// log10(+INF) is +INF; log10(0) is -INF;
|
| -// log10(NaN) is that NaN;
|
| -// log10(10**N) = N for N=0,1,...,22.
|
| -//
|
| -
|
| -define IVLN10 = 4.34294481903251816668e-01;
|
| -define LOG10_2HI = 3.01029995663611771306e-01;
|
| -define LOG10_2LO = 3.69423907715893078616e-13;
|
| -
|
| -function MathLog10(x) {
|
| - x = x * 1; // Convert to number.
|
| - var hx = %_DoubleHi(x);
|
| - var lx = %_DoubleLo(x);
|
| - var k = 0;
|
| -
|
| - if (hx < 0x00100000) {
|
| - // x < 2^-1022
|
| - // log10(+/- 0) = -Infinity.
|
| - if (((hx & 0x7fffffff) | lx) === 0) return -INFINITY;
|
| - // log10 of negative number is NaN.
|
| - if (hx < 0) return NaN;
|
| - // Subnormal number. Scale up x.
|
| - k -= 54;
|
| - x *= TWO54;
|
| - hx = %_DoubleHi(x);
|
| - lx = %_DoubleLo(x);
|
| - }
|
| -
|
| - // Infinity or NaN.
|
| - if (hx >= 0x7ff00000) return x;
|
| -
|
| - k += (hx >> 20) - 1023;
|
| - var i = (k & 0x80000000) >>> 31;
|
| - hx = (hx & 0x000fffff) | ((0x3ff - i) << 20);
|
| - var y = k + i;
|
| - x = %_ConstructDouble(hx, lx);
|
| -
|
| - var z = y * LOG10_2LO + IVLN10 * %math_log(x);
|
| - return z + y * LOG10_2HI;
|
| -}
|
| -
|
| -
|
| -// ES6 draft 09-27-13, section 20.2.2.22.
|
| -// Return the base 2 logarithm of x
|
| -//
|
| -// fdlibm does not have an explicit log2 function, but fdlibm's pow
|
| -// function does implement an accurate log2 function as part of the
|
| -// pow implementation. This extracts the core parts of that as a
|
| -// separate log2 function.
|
| -
|
| -// Method:
|
| -// Compute log2(x) in two pieces:
|
| -// log2(x) = w1 + w2
|
| -// where w1 has 53-24 = 29 bits of trailing zeroes.
|
| -
|
| -define DP_H = 5.84962487220764160156e-01;
|
| -define DP_L = 1.35003920212974897128e-08;
|
| -
|
| -// Polynomial coefficients for (3/2)*(log2(x) - 2*s - 2/3*s^3)
|
| -define LOG2_1 = 5.99999999999994648725e-01;
|
| -define LOG2_2 = 4.28571428578550184252e-01;
|
| -define LOG2_3 = 3.33333329818377432918e-01;
|
| -define LOG2_4 = 2.72728123808534006489e-01;
|
| -define LOG2_5 = 2.30660745775561754067e-01;
|
| -define LOG2_6 = 2.06975017800338417784e-01;
|
| -
|
| -// cp = 2/(3*ln(2)). Note that cp_h + cp_l is cp, but with more accuracy.
|
| -define CP = 9.61796693925975554329e-01;
|
| -define CP_H = 9.61796700954437255859e-01;
|
| -define CP_L = -7.02846165095275826516e-09;
|
| -// 2^53
|
| -define TWO53 = 9007199254740992;
|
| -
|
| -function MathLog2(x) {
|
| - x = x * 1; // Convert to number.
|
| - var ax = MathAbs(x);
|
| - var hx = %_DoubleHi(x);
|
| - var lx = %_DoubleLo(x);
|
| - var ix = hx & 0x7fffffff;
|
| -
|
| - // Handle special cases.
|
| - // log2(+/- 0) = -Infinity
|
| - if ((ix | lx) == 0) return -INFINITY;
|
| -
|
| - // log(x) = NaN, if x < 0
|
| - if (hx < 0) return NaN;
|
| -
|
| - // log2(Infinity) = Infinity, log2(NaN) = NaN
|
| - if (ix >= 0x7ff00000) return x;
|
| -
|
| - var n = 0;
|
| -
|
| - // Take care of subnormal number.
|
| - if (ix < 0x00100000) {
|
| - ax *= TWO53;
|
| - n -= 53;
|
| - ix = %_DoubleHi(ax);
|
| - }
|
| -
|
| - n += (ix >> 20) - 0x3ff;
|
| - var j = ix & 0x000fffff;
|
| -
|
| - // Determine interval.
|
| - ix = j | 0x3ff00000; // normalize ix.
|
| -
|
| - var bp = 1;
|
| - var dp_h = 0;
|
| - var dp_l = 0;
|
| - if (j > 0x3988e) { // |x| > sqrt(3/2)
|
| - if (j < 0xbb67a) { // |x| < sqrt(3)
|
| - bp = 1.5;
|
| - dp_h = DP_H;
|
| - dp_l = DP_L;
|
| - } else {
|
| - n += 1;
|
| - ix -= 0x00100000;
|
| - }
|
| - }
|
| -
|
| - ax = %_ConstructDouble(ix, %_DoubleLo(ax));
|
| -
|
| - // Compute ss = s_h + s_l = (x - 1)/(x+1) or (x - 1.5)/(x + 1.5)
|
| - var u = ax - bp;
|
| - var v = 1 / (ax + bp);
|
| - var ss = u * v;
|
| - var s_h = %_ConstructDouble(%_DoubleHi(ss), 0);
|
| -
|
| - // t_h = ax + bp[k] High
|
| - var t_h = %_ConstructDouble(%_DoubleHi(ax + bp), 0)
|
| - var t_l = ax - (t_h - bp);
|
| - var s_l = v * ((u - s_h * t_h) - s_h * t_l);
|
| -
|
| - // Compute log2(ax)
|
| - var s2 = ss * ss;
|
| - var r = s2 * s2 * (LOG2_1 + s2 * (LOG2_2 + s2 * (LOG2_3 + s2 * (
|
| - LOG2_4 + s2 * (LOG2_5 + s2 * LOG2_6)))));
|
| - r += s_l * (s_h + ss);
|
| - s2 = s_h * s_h;
|
| - t_h = %_ConstructDouble(%_DoubleHi(3.0 + s2 + r), 0);
|
| - t_l = r - ((t_h - 3.0) - s2);
|
| - // u + v = ss * (1 + ...)
|
| - u = s_h * t_h;
|
| - v = s_l * t_h + t_l * ss;
|
| -
|
| - // 2 / (3 * log(2)) * (ss + ...)
|
| - var p_h = %_ConstructDouble(%_DoubleHi(u + v), 0);
|
| - var p_l = v - (p_h - u);
|
| - var z_h = CP_H * p_h;
|
| - var z_l = CP_L * p_h + p_l * CP + dp_l;
|
| -
|
| - // log2(ax) = (ss + ...) * 2 / (3 * log(2)) = n + dp_h + z_h + z_l
|
| - var t = n;
|
| - var t1 = %_ConstructDouble(%_DoubleHi(((z_h + z_l) + dp_h) + t), 0);
|
| - var t2 = z_l - (((t1 - t) - dp_h) - z_h);
|
| -
|
| - // t1 + t2 = log2(ax), sum up because we do not care about extra precision.
|
| - return t1 + t2;
|
| -}
|
| -
|
| //-------------------------------------------------------------------
|
|
|
| utils.InstallFunctions(GlobalMath, DONT_ENUM, [
|
| @@ -947,8 +766,6 @@ utils.InstallFunctions(GlobalMath, DONT_ENUM, [
|
| "sinh", MathSinh,
|
| "cosh", MathCosh,
|
| "tanh", MathTanh,
|
| - "log10", MathLog10,
|
| - "log2", MathLog2,
|
| "expm1", MathExpm1
|
| ]);
|
|
|
|
|