Index: third_party/fdlibm/fdlibm.js |
diff --git a/third_party/fdlibm/fdlibm.js b/third_party/fdlibm/fdlibm.js |
index 9bdd97923317cd8c316819529c7c008e359005ff..95ea5f442f034e7226d3fc803c459bd0345b634f 100644 |
--- a/third_party/fdlibm/fdlibm.js |
+++ b/third_party/fdlibm/fdlibm.js |
@@ -710,3 +710,52 @@ function MathExpm1(x) { |
} |
return y; |
} |
+ |
+ |
+// ES6 draft 09-27-13, section 20.2.2.30. |
+// Math.sinh |
+// Method : |
+// mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2 |
+// 1. Replace x by |x| (sinh(-x) = -sinh(x)). |
+// 2. |
+// E + E/(E+1) |
+// 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x) |
+// 2 |
+// |
+// 22 <= x <= lnovft : sinh(x) := exp(x)/2 |
+// lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2) |
+// ln2ovft < x : sinh(x) := x*shuge (overflow) |
+// |
+// Special cases: |
+// sinh(x) is |x| if x is +Infinity, -Infinity, or NaN. |
+// only sinh(0)=0 is exact for finite x. |
+// |
+const KSINH_OVERFLOW = kMath[52]; |
+const TWO_M28 = 3.725290298461914e-9; // 2^-28, empty lower half |
+const LOG_MAXD = 709.7822265625; // 0x40862e42 00000000, empty lower half |
+ |
+function MathSinh(x) { |
+ x = x * 1; // Convert to number. |
+ var h = (x < 0) ? -0.5 : 0.5; |
+ // |x| in [0, 22]. return sign(x)*0.5*(E+E/(E+1)) |
+ var ax = MathAbs(x); |
+ if (ax < 22) { |
+ // For |x| < 2^-28, sinh(x) = x |
+ if (ax < TWO_M28) return x; |
+ var t = MathExpm1(ax); |
+ if (ax < 1) return h * (2 * t - t * t / (t + 1)); |
+ return h * (t + t / (t + 1)); |
+ } |
+ // |x| in [22, log(maxdouble)], return 0.5 * exp(|x|) |
+ if (ax < LOG_MAXD) return h * MathExp(ax); |
+ // |x| in [log(maxdouble), overflowthreshold] |
+ // overflowthreshold = 710.4758600739426 |
+ if (ax <= KSINH_OVERFLOW) { |
+ var w = MathExp(0.5 * ax); |
+ var t = h * w; |
+ return t * w; |
+ } |
+ // |x| > overflowthreshold or is NaN. |
+ // Return Infinity of the appropriate sign or NaN. |
+ return x * INFINITY; |
+} |