1 
2 /* @(#)w_cosh.c 5.1 93/09/24 */
3 /*
4  * ====================================================
5  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6  *
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  * ====================================================
12  */
13 
14 /*
15 
16 FUNCTION
17         <<cosh>>, <<coshf>>---hyperbolic cosine
18 
19 ANSI_SYNOPSIS
20         #include <math.h>
21         double cosh(double <[x]>);
22         float coshf(float <[x]>)
23 
24 TRAD_SYNOPSIS
25         #include <math.h>
26         double cosh(<[x]>)
27         double <[x]>;
28 
29         float coshf(<[x]>)
30         float <[x]>;
31 
32 DESCRIPTION
33 
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
42 
43 	Angles are specified in radians.
44 
45 	<<coshf>> is identical, save that it takes and returns <<float>>.
46 
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>>.
51 
52 	You can modify error handling for these functions using the
53 	function <<matherr>>.
54 
55 PORTABILITY
56 	<<cosh>> is ANSI.
57 	<<coshf>> is an extension.
58 
59 QUICKREF
60 	cosh ansi pure
61 	coshf - pure
62 */
63 
64 /*
65  * wrapper cosh(x)
66  */
67 
68 #include "fdlibm.h"
69 #include <errno.h>
70 
71 #ifndef _DOUBLE_IS_32BITS
72 
73 #ifdef __STDC__
cosh(double x)74 	double cosh(double x)		/* wrapper cosh */
75 #else
76 	double cosh(x)			/* wrapper cosh */
77 	double x;
78 #endif
79 {
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;
92 
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;
107 	    }
108 	    if (exc.err != 0)
109 	       errno = exc.err;
110 	    return exc.retval;
111 	} else
112 	    return z;
113 #endif
114 }
115 
116 #endif /* defined(_DOUBLE_IS_32BITS) */
117