1 2 /* @(#)w_sinh.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 <<sinh>>, <<sinhf>>---hyperbolic sine 18 19 INDEX 20 sinh 21 INDEX 22 sinhf 23 24 ANSI_SYNOPSIS 25 #include <math.h> 26 double sinh(double <[x]>); 27 float sinhf(float <[x]>); 28 29 TRAD_SYNOPSIS 30 #include <math.h> 31 double sinh(<[x]>) 32 double <[x]>; 33 34 float sinhf(<[x]>) 35 float <[x]>; 36 37 DESCRIPTION 38 <<sinh>> computes the hyperbolic sine of the argument <[x]>. 39 Angles are specified in radians. <<sinh>>(<[x]>) is defined as 40 @ifnottex 41 . (exp(<[x]>) - exp(-<[x]>))/2 42 @end ifnottex 43 @tex 44 $${e^x - e^{-x}}\over 2$$ 45 @end tex 46 47 <<sinhf>> is identical, save that it takes and returns <<float>> values. 48 49 RETURNS 50 The hyperbolic sine of <[x]> is returned. 51 52 When the correct result is too large to be representable (an 53 overflow), <<sinh>> returns <<HUGE_VAL>> with the 54 appropriate sign, and sets the global value <<errno>> to 55 <<ERANGE>>. 56 57 You can modify error handling for these functions with <<matherr>>. 58 59 PORTABILITY 60 <<sinh>> is ANSI C. 61 <<sinhf>> is an extension. 62 63 QUICKREF 64 sinh ansi pure 65 sinhf - pure 66 */ 67 68 /* 69 * wrapper sinh(x) 70 */ 71 72 #include "fdlibm.h" 73 #include <errno.h> 74 75 #ifndef _DOUBLE_IS_32BITS 76 77 #ifdef __STDC__ sinh(double x)78 double sinh(double x) /* wrapper sinh */ 79 #else 80 double sinh(x) /* wrapper sinh */ 81 double x; 82 #endif 83 { 84 #ifdef _IEEE_LIBM 85 return __ieee754_sinh(x); 86 #else 87 double z; 88 struct exception exc; 89 z = __ieee754_sinh(x); 90 if(_LIB_VERSION == _IEEE_) return z; 91 if(!finite(z)&&finite(x)) { 92 /* sinh(finite) overflow */ 93 #ifndef HUGE_VAL 94 #define HUGE_VAL inf 95 double inf = 0.0; 96 97 SET_HIGH_WORD(inf,0x7ff00000); /* set inf to infinite */ 98 #endif 99 exc.type = OVERFLOW; 100 exc.name = "sinh"; 101 exc.err = 0; 102 exc.arg1 = exc.arg2 = x; 103 if (_LIB_VERSION == _SVID_) 104 exc.retval = ( (x>0.0) ? HUGE : -HUGE); 105 else 106 exc.retval = ( (x>0.0) ? HUGE_VAL : -HUGE_VAL); 107 if (_LIB_VERSION == _POSIX_) 108 errno = ERANGE; 109 else if (!matherr(&exc)) { 110 errno = ERANGE; 111 } 112 if (exc.err != 0) 113 errno = exc.err; 114 return exc.retval; 115 } else 116 return z; 117 #endif 118 } 119 120 #endif /* defined(_DOUBLE_IS_32BITS) */ 121