| Index: third_party/fdlibm/fdlibm.js
|
| diff --git a/third_party/fdlibm/fdlibm.js b/third_party/fdlibm/fdlibm.js
|
| index 95ea5f442f034e7226d3fc803c459bd0345b634f..08c6f5e7207112ac80c5f420f98990e56b7468b0 100644
|
| --- a/third_party/fdlibm/fdlibm.js
|
| +++ b/third_party/fdlibm/fdlibm.js
|
| @@ -759,3 +759,56 @@ function MathSinh(x) {
|
| // Return Infinity of the appropriate sign or NaN.
|
| return x * INFINITY;
|
| }
|
| +
|
| +
|
| +// ES6 draft 09-27-13, section 20.2.2.12.
|
| +// Math.cosh
|
| +// Method :
|
| +// mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2
|
| +// 1. Replace x by |x| (cosh(x) = cosh(-x)).
|
| +// 2.
|
| +// [ exp(x) - 1 ]^2
|
| +// 0 <= x <= ln2/2 : cosh(x) := 1 + -------------------
|
| +// 2*exp(x)
|
| +//
|
| +// exp(x) + 1/exp(x)
|
| +// ln2/2 <= x <= 22 : cosh(x) := -------------------
|
| +// 2
|
| +// 22 <= x <= lnovft : cosh(x) := exp(x)/2
|
| +// lnovft <= x <= ln2ovft: cosh(x) := exp(x/2)/2 * exp(x/2)
|
| +// ln2ovft < x : cosh(x) := huge*huge (overflow)
|
| +//
|
| +// Special cases:
|
| +// cosh(x) is |x| if x is +INF, -INF, or NaN.
|
| +// only cosh(0)=1 is exact for finite x.
|
| +//
|
| +const KCOSH_OVERFLOW = kMath[52];
|
| +
|
| +function MathCosh(x) {
|
| + x = x * 1; // Convert to number.
|
| + var ix = %_DoubleHi(x) & 0x7fffffff;
|
| + // |x| in [0,0.5*log2], return 1+expm1(|x|)^2/(2*exp(|x|))
|
| + if (ix < 0x3fd62e43) {
|
| + var t = MathExpm1(MathAbs(x));
|
| + var w = 1 + t;
|
| + // For |x| < 2^-55, cosh(x) = 1
|
| + if (ix < 0x3c800000) return w;
|
| + return 1 + (t * t) / (w + w);
|
| + }
|
| + // |x| in [0.5*log2, 22], return (exp(|x|)+1/exp(|x|)/2
|
| + if (ix < 0x40360000) {
|
| + var t = MathExp(MathAbs(x));
|
| + return 0.5 * t + 0.5 / t;
|
| + }
|
| + // |x| in [22, log(maxdouble)], return half*exp(|x|)
|
| + if (ix < 0x40862e42) return 0.5 * MathExp(MathAbs(x));
|
| + // |x| in [log(maxdouble), overflowthreshold]
|
| + if (MathAbs(x) <= KCOSH_OVERFLOW) {
|
| + var w = MathExp(0.5 * MathAbs(x));
|
| + var t = 0.5 * w;
|
| + return t * w;
|
| + }
|
| + if (NUMBER_IS_NAN(x)) return x;
|
| + // |x| > overflowthreshold.
|
| + return INFINITY;
|
| +}
|
|
|