Index: src/third_party/fdlibm/fdlibm.js |
diff --git a/src/third_party/fdlibm/fdlibm.js b/src/third_party/fdlibm/fdlibm.js |
index b52f1de2693feb84f2f39cc9a180db73210ca1cd..93a15483c27b09f35411d92e458ae9d10073cb8d 100644 |
--- a/src/third_party/fdlibm/fdlibm.js |
+++ b/src/third_party/fdlibm/fdlibm.js |
@@ -812,3 +812,66 @@ function MathCosh(x) { |
// |x| > overflowthreshold. |
return INFINITY; |
} |
+ |
+// 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. |
+// |
+ |
+const IVLN10 = kMath[53]; |
+const LOG10_2HI = kMath[54]; |
+const LOG10_2LO = kMath[55]; |
+ |
+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; |
+ i = (k & 0x80000000) >> 31; |
+ hx = (hx & 0x000fffff) | ((0x3ff - i) << 20); |
+ y = k + i; |
+ x = %_ConstructDouble(hx, lx); |
+ |
+ z = y * LOG10_2LO + IVLN10 * MathLog(x); |
+ return z + y * LOG10_2HI; |
+} |