Code coverage report for fdlibm/tanh.js

Statements: 100% (16 / 16)      Branches: 100% (12 / 12)      Functions: 100% (1 / 1)      Lines: 100% (16 / 16)      Ignored: none     

All files » fdlibm/ » tanh.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74                                                                      1   13   3 1   2       10     10 6           2   4   2 2   2 2       4     8    
//
// ====================================================
// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
//
// Developed at SunSoft, a Sun Microsystems, Inc. business.
// Permission to use, copy, modify, and distribute this
// software is freely granted, provided that this notice 
// is preserved.
// ====================================================
//
 
// Tanh(x)
// Return the Hyperbolic Tangent of 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.
//
 
function tanh (x) {
    // x is Infinity or NaN
    if (!isFinite(x)) {
        // tanh(+/-inf) = +/- 1, tanh(NaN) = NaN;
        if (x > 0) {
            return 1/x + 1;
        } else {
            return 1/x - 1;
        }
    }
 
    var ax = Math.abs(x);
 
    // |x| < 22
    if (ax < 22) {
        if (ax < Math.pow(2,-55)) {
            // |x| < 2^-55, tanh(small) = small.
            //
            // The multiplication by 1+x is probably so inexact is
            // signaled when x is not zero. This is probably not
            // required for Javascript, so we could just return x.
            return x*(1 + x);
        }
        if (ax >= 1) {
            // |x| >= 1
            t = expm1(2*ax);
            z = 1 - 2/(t + 2);
        } else {
            t = expm1(-2*ax);
            z = -t/(t + 2);
        }
    } else {
        // |x| > 22, return +/- 1
        z = 1;
    }
 
    return (x >= 0) ? z : -z;
}