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 |
]); |