Chromium Code Reviews| 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]; |
|
Raymond Toy
2014/08/29 16:23:31
You might want to add a comment in fdlibm.cc that
Yang
2014/09/01 09:35:42
Done.
|
| + |
| +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; |
| +} |