fixes for host gcc 4.6.1
[zpugcc/jano.git] / toolchain / gcc / newlib / libm / math / w_cosh.c
blobab046f6edc10f35dd7dc564a225fc48f6cac508b
2 /* @(#)w_cosh.c 5.1 93/09/24 */
3 /*
4 * ====================================================
5 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
7 * Developed at SunPro, a Sun Microsystems, Inc. business.
8 * Permission to use, copy, modify, and distribute this
9 * software is freely granted, provided that this notice
10 * is preserved.
11 * ====================================================
16 FUNCTION
17 <<cosh>>, <<coshf>>---hyperbolic cosine
19 ANSI_SYNOPSIS
20 #include <math.h>
21 double cosh(double <[x]>);
22 float coshf(float <[x]>)
24 TRAD_SYNOPSIS
25 #include <math.h>
26 double cosh(<[x]>)
27 double <[x]>;
29 float coshf(<[x]>)
30 float <[x]>;
32 DESCRIPTION
34 <<cosh>> computes the hyperbolic cosine of the argument <[x]>.
35 <<cosh(<[x]>)>> is defined as
36 @ifnottex
37 . (exp(x) + exp(-x))/2
38 @end ifnottex
39 @tex
40 $${(e^x + e^{-x})} \over 2$$
41 @end tex
43 Angles are specified in radians.
45 <<coshf>> is identical, save that it takes and returns <<float>>.
47 RETURNS
48 The computed value is returned. When the correct value would create
49 an overflow, <<cosh>> returns the value <<HUGE_VAL>> with the
50 appropriate sign, and the global value <<errno>> is set to <<ERANGE>>.
52 You can modify error handling for these functions using the
53 function <<matherr>>.
55 PORTABILITY
56 <<cosh>> is ANSI.
57 <<coshf>> is an extension.
59 QUICKREF
60 cosh ansi pure
61 coshf - pure
64 /*
65 * wrapper cosh(x)
68 #include "fdlibm.h"
69 #include <errno.h>
71 #ifndef _DOUBLE_IS_32BITS
73 #ifdef __STDC__
74 double cosh(double x) /* wrapper cosh */
75 #else
76 double cosh(x) /* wrapper cosh */
77 double x;
78 #endif
80 #ifdef _IEEE_LIBM
81 return __ieee754_cosh(x);
82 #else
83 double z;
84 struct exception exc;
85 z = __ieee754_cosh(x);
86 if(_LIB_VERSION == _IEEE_ || isnan(x)) return z;
87 if(fabs(x)>7.10475860073943863426e+02) {
88 /* cosh(finite) overflow */
89 #ifndef HUGE_VAL
90 #define HUGE_VAL inf
91 double inf = 0.0;
93 SET_HIGH_WORD(inf,0x7ff00000); /* set inf to infinite */
94 #endif
95 exc.type = OVERFLOW;
96 exc.name = "cosh";
97 exc.err = 0;
98 exc.arg1 = exc.arg2 = x;
99 if (_LIB_VERSION == _SVID_)
100 exc.retval = HUGE;
101 else
102 exc.retval = HUGE_VAL;
103 if (_LIB_VERSION == _POSIX_)
104 errno = ERANGE;
105 else if (!matherr(&exc)) {
106 errno = ERANGE;
108 if (exc.err != 0)
109 errno = exc.err;
110 return exc.retval;
111 } else
112 return z;
113 #endif
116 #endif /* defined(_DOUBLE_IS_32BITS) */