Return the hyperbolic tangent of a double. - Java java.lang

Java examples for java.lang:Math Operation

Description

Return the hyperbolic tangent of a double.

Demo Code

/**   Basic numeric operations not included in standard Java run-time library.
 *
 *   <p>/*from  ww w. j av a  2s .  c  om*/
 *   The binomial methods are modified from those in the Colt library.
 *   </p>
 *
 *   <p>
 *   The following methods for trigonometric functions come from the
 *   Sfun class written by Visual Numerics.
 *   </p>
 *
 *   <ul>
 *   <li>acosh</li>
 *   <li>asinh</li>
 *   <li>atanh</li>
 *   <li>cot</li>
 *   <li>cosh</li>
 *   <li>sinh</li>
 *   <li>tanh</li>
 *   </ul>
 *
 *   <p>
 *   These methods are covered by the following license.
 *   </p>
 *
 * -------------------------------------------------------------------------
 *   $Id: Sfun.java,v 1.1.1.1 1999/03/05 21:43:39 brophy Exp $
 * -------------------------------------------------------------------------
 * Copyright (c) 1997 - 1998 by Visual Numerics, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this software is freely
 * granted by Visual Numerics, Inc., provided that the copyright notice
 * above and the following warranty disclaimer are preserved in human
 * readable form.
 *
 * Because this software is licensed free of charge, it is provided
 * "AS IS", with NO WARRANTY.  TO THE EXTENT PERMITTED BY LAW, VNI
 * DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO ITS PERFORMANCE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * VNI WILL NOT BE LIABLE FOR ANY DAMAGES WHATSOEVER ARISING OUT OF THE USE
 * OF OR INABILITY TO USE THIS SOFTWARE, INCLUDING BUT NOT LIMITED TO DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, PUNITIVE, AND EXEMPLARY DAMAGES, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * -------------------------------------------------------------------------
 */

public class Main{
    public static void main(String[] argv) throws Exception{
        double x = 2.45678;
        System.out.println(tanh(x));
    }
    private static final double TANH_COEF[] = { -.25828756643634710,
            -.11836106330053497, .009869442648006398, -.000835798662344582,
            .000070904321198943, -.000006016424318120, .000000510524190800,
            -.000000043320729077, .000000003675999055,
            -.000000000311928496, .000000000026468828,
            -.000000000002246023, .000000000000190587,
            -.000000000000016172, .000000000000001372,
            -.000000000000000116, .000000000000000009 };
    /**   Return the hyperbolic tangent of a double.
     *
     *   @param   x   The value whose hyperbolic tangent is desired.
     *
     *   @return      The hyperbolic tangent of x.
     *
     *   <p>
     *   This method is a modified version of the one in the
     *   Visual Numerics Sfun class.
     *   </p>
     */

    public static double tanh(double x) {
        double ans, y;

        y = Math.abs(x);

        if (Double.isNaN(x)) {
            ans = Double.NaN;
        }
        // 1.82501e-08 = Math.sqrt(3.0*EPSILON_SMALL)

        else if (y < 1.82501e-08) {
            ans = x;
        } else if (y <= 1.0D) {
            ans = x
                    * (1.0D + Polynomial.evaluateChebyschev(TANH_COEF, 2.0D
                            * x * x - 1.0D));
        }
        // 7.977294885 = -0.5*Math.log(EPSILON_SMALL)

        else if (y < 7.977294885) {
            y = Math.exp(y);
            ans = sign((y - 1.0D / y) / (y + 1.0D / y), x);
        } else {
            ans = sign(1.0D, x);
        }

        return ans;
    }
    /**   Return sign of an integer.
     *
     *   @param   n   Number whose sign is desired.
     *
     *   @return      -1 if n < 0, 0 if n isn 0, 1 if n > 0.
     */

    public static int sign(int n) {
        if (n > 0) {
            return 1;
        } else if (n < 0) {
            return -1;
        }

        return 0;
    }
    /**   Return sign of a double.
     *
     *   @param   d   double whose sign is desired.
     *
     *   @return      -1 if d < 0, 0 if d is 0, 1 if d > 0.
     */

    public static int sign(double d) {
        if (d > 0.0D) {
            return 1;
        } else if (d < 0.0D) {
            return -1;
        }

        return 0;
    }
    /**   Return the value of a double with the sign of another double.
     *
     *   @param   x   First double.
     *   @param   y   Second double.
     *
     *   @return      x with the sign of y.
     */

    public static double sign(double x, double y) {
        double abs_x = ((x < 0) ? -x : x);

        return (y < 0.0) ? -abs_x : abs_x;
    }
}

Related Tutorials