OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libm/] [mathfp/] [s_tanh.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 56 joel
 
2
/* @(#)z_tanh.c 1.0 98/08/13 */
3
/*****************************************************************
4
 * The following routines are coded directly from the algorithms
5
 * and coefficients given in "Software Manual for the Elementary
6
 * Functions" by William J. Cody, Jr. and William Waite, Prentice
7
 * Hall, 1980.
8
 *****************************************************************/
9
 
10
/*
11
 
12
FUNCTION
13
        <<tanh>>, <<tanhf>>---hyperbolic tangent
14
 
15
INDEX
16
tanh
17
INDEX
18
tanhf
19
 
20
ANSI_SYNOPSIS
21
        #include <math.h>
22
        double tanh(double <[x]>);
23
        float tanhf(float <[x]>);
24
 
25
TRAD_SYNOPSIS
26
        #include <math.h>
27
        double tanh(<[x]>)
28
        double <[x]>;
29
 
30
        float tanhf(<[x]>)
31
        float <[x]>;
32
 
33
 
34
DESCRIPTION
35
 
36
<<tanh>> computes the hyperbolic tangent of
37
the argument <[x]>.  Angles are specified in radians.
38
 
39
<<tanh(<[x]>)>> is defined as
40
. sinh(<[x]>)/cosh(<[x]>)
41
 
42
<<tanhf>> is identical, save that it takes and returns <<float>> values.
43
 
44
RETURNS
45
The hyperbolic tangent of <[x]> is returned.
46
 
47
PORTABILITY
48
<<tanh>> is ANSI C.  <<tanhf>> is an extension.
49
 
50
*/
51
 
52
/******************************************************************
53
 * Hyperbolic Tangent
54
 *
55
 * Input:
56
 *   x - floating point value
57
 *
58
 * Output:
59
 *   hyperbolic tangent of x
60
 *
61
 * Description:
62
 *   This routine calculates hyperbolic tangent.
63
 *
64
 *****************************************************************/
65
 
66
#include <float.h>
67
#include "fdlibm.h"
68
#include "zmath.h"
69
 
70
#ifndef _DOUBLE_IS_32BITS
71
 
72
static const double LN3_OVER2 = 0.54930614433405484570;
73
static const double p[] = { -0.16134119023996228053e+4,
74
                            -0.99225929672236083313e+2,
75
                            -0.96437492777225469787 };
76
static const double q[] = { 0.48402357071988688686e+4,
77
                            0.22337720718962312926e+4,
78
                            0.11274474380534949335e+3 };
79
 
80
double
81
_DEFUN (tanh, (double),
82
        double x)
83
{
84
  double f, res, g, P, Q, R;
85
 
86
  f = fabs (x);
87
 
88
  /* Check if the input is too big. */
89
  if (f > BIGX)
90
    res = 1.0;
91
 
92
  else if (f > LN3_OVER2)
93
    res = 1.0 - 2.0 / (exp (2 * f) + 1.0);
94
 
95
  /* Check if the input is too small. */
96
  else if (f < z_rooteps)
97
    res = f;
98
 
99
  /* Calculate the Taylor series. */
100
  else
101
    {
102
      g = f * f;
103
 
104
      P = (p[2] * g + p[1]) * g + p[0];
105
      Q = ((g + q[2]) * g + q[1]) * g + q[0];
106
      R = g * (P / Q);
107
 
108
      res = f + f * R;
109
    }
110
 
111
  if (x < 0.0)
112
    res = -res;
113
 
114
  return (res);
115
}
116
 
117
#endif /* _DOUBLE_IS_32BITS */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.