Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Unified Diff: src/third_party/fdlibm/fdlibm.js

Issue 1407213002: Implement Math.tanh using fdlibm port. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: delete the actual old implementation Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/js/math.js ('k') | test/mjsunit/es6/math-hyperbolic.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/third_party/fdlibm/fdlibm.js
diff --git a/src/third_party/fdlibm/fdlibm.js b/src/third_party/fdlibm/fdlibm.js
index d89f69b5f5900fe76adfeb69e25be89d84f641aa..983a86c151ac36e38f30610ef6f20570e82c9831 100644
--- a/src/third_party/fdlibm/fdlibm.js
+++ b/src/third_party/fdlibm/fdlibm.js
@@ -843,6 +843,63 @@ function MathCosh(x) {
return INFINITY;
}
+// ES6 draft 09-27-13, section 20.2.2.33.
+// Math.tanh(x)
+// Method :
+// x -x
+// e - e
+// 0. tanh(x) is defined to be -----------
+// x -x
+// e + e
+// 1. reduce x to non-negative by tanh(-x) = -tanh(x).
+// 2. 0 <= x <= 2**-55 : tanh(x) := x*(one+x)
+// -t
+// 2**-55 < x <= 1 : tanh(x) := -----; t = expm1(-2x)
+// t + 2
+// 2
+// 1 <= x <= 22.0 : tanh(x) := 1- ----- ; t = expm1(2x)
+// t + 2
+// 22.0 < x <= INF : tanh(x) := 1.
+//
+// Special cases:
+// tanh(NaN) is NaN;
+// only tanh(0) = 0 is exact for finite argument.
+//
+
+define TWO_M55 = 2.77555756156289135105e-17; // 2^-55, empty lower half
Raymond Toy 2015/10/16 17:07:25 A bit late, but this comment is incorrect. Since
+
+function MathTanh(x) {
+ x = x * 1; // Convert to number.
+ // x is Infinity or NaN
+ if (!NUMBER_IS_FINITE(x)) {
+ if (x > 0) return 1;
+ if (x < 0) return -1;
+ return x;
+ }
+
+ var ax = MathAbs(x);
+ var z;
+ // |x| < 22
+ if (ax < 22) {
+ if (ax < TWO_M55) {
+ // |x| < 2^-55, tanh(small) = small.
+ return x;
+ }
+ if (ax >= 1) {
+ // |x| >= 1
+ var t = MathExpm1(2 * ax);
+ z = 1 - 2 / (t + 2);
+ } else {
+ var t = MathExpm1(-2 * ax);
+ z = -t / (t + 2);
+ }
+ } else {
+ // |x| > 22, return +/- 1
+ z = 1;
+ }
+ return (x >= 0) ? z : -z;
+}
+
// ES6 draft 09-27-13, section 20.2.2.21.
// Return the base 10 logarithm of x
//
@@ -1029,6 +1086,7 @@ utils.InstallFunctions(GlobalMath, DONT_ENUM, [
"tan", MathTan,
"sinh", MathSinh,
"cosh", MathCosh,
+ "tanh", MathTanh,
"log10", MathLog10,
"log2", MathLog2,
"log1p", MathLog1p,
« no previous file with comments | « src/js/math.js ('k') | test/mjsunit/es6/math-hyperbolic.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698