1 /* Complex cosine hyperbole function for float. 2 Copyright (C) 1997 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, write to the Free 18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19 02111-1307 USA. */ 20 21 #include <complex.h> 22 #include <fenv.h> 23 #include <math.h> 24 25 #include "math_private.h" 26 27 28 __complex__ float 29 __ccoshf (__complex__ float x) 30 { 31 __complex__ float retval; 32 int rcls = fpclassify (__real__ x); 33 int icls = fpclassify (__imag__ x); 34 35 if (rcls >= FP_ZERO) 36 { 37 /* Real part is finite. */ 38 if (icls >= FP_ZERO) 39 { 40 /* Imaginary part is finite. */ 41 float sinh_val = sinhf (__real__ x); 42 float cosh_val = coshf (__real__ x); 43 float sinix, cosix; 44 45 sincosf (__imag__ x, &sinix, &cosix); 46 47 __real__ retval = cosh_val * cosix; 48 __imag__ retval = sinh_val * sinix; 49 } 50 else 51 { 52 __imag__ retval = __real__ x == 0.0 ? 0.0 : nanf (""); 53 __real__ retval = nanf (""); 54 55 #ifdef FE_INVALID 56 if (icls == FP_INFINITE) 57 feraiseexcept (FE_INVALID); 58 #endif 59 } 60 } 61 else if (rcls == FP_INFINITE) 62 { 63 /* Real part is infinite. */ 64 if (icls == FP_ZERO) 65 { 66 /* Imaginary part is 0.0. */ 67 __real__ retval = HUGE_VALF; 68 __imag__ retval = __imag__ x * copysignf (1.0, __real__ x); 69 } 70 else if (icls > FP_ZERO) 71 { 72 /* Imaginary part is finite. */ 73 float sinix, cosix; 74 75 sincosf (__imag__ x, &sinix, &cosix); 76 77 __real__ retval = copysignf (HUGE_VALF, cosix); 78 __imag__ retval = (copysignf (HUGE_VALF, sinix) 79 * copysignf (1.0, __real__ x)); 80 } 81 else 82 { 83 /* The addition raises the invalid exception. */ 84 __real__ retval = HUGE_VALF; 85 __imag__ retval = nanf ("") + nanf (""); 86 87 #ifdef FE_INVALID 88 if (icls == FP_INFINITE) 89 feraiseexcept (FE_INVALID); 90 #endif 91 } 92 } 93 else 94 { 95 __real__ retval = nanf (""); 96 __imag__ retval = __imag__ x == 0.0 ? __imag__ x : nanf (""); 97 } 98 99 return retval; 100 } 101 #ifndef __ccoshf 102 weak_alias (__ccoshf, ccoshf) 103 #endif 104