1 /* Return arc hyperbolic cosine for a complex type. 2 Copyright (C) 1997-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <complex.h> 20 #include <math.h> 21 22 23 CFLOAT M_DECL_FUNC(__cacosh)24M_DECL_FUNC (__cacosh) (CFLOAT x) 25 { 26 CFLOAT res; 27 int rcls = fpclassify (__real__ x); 28 int icls = fpclassify (__imag__ x); 29 30 if (rcls <= FP_INFINITE || icls <= FP_INFINITE) 31 { 32 if (icls == FP_INFINITE) 33 { 34 __real__ res = M_HUGE_VAL; 35 36 if (rcls == FP_NAN) 37 __imag__ res = M_NAN; 38 else 39 __imag__ res = M_COPYSIGN ((rcls == FP_INFINITE 40 ? (__real__ x < 0 41 ? M_MLIT (M_PI) - M_MLIT (M_PI_4) 42 : M_MLIT (M_PI_4)) 43 : M_MLIT (M_PI_2)), __imag__ x); 44 } 45 else if (rcls == FP_INFINITE) 46 { 47 __real__ res = M_HUGE_VAL; 48 49 if (icls >= FP_ZERO) 50 __imag__ res = M_COPYSIGN (signbit (__real__ x) 51 ? M_MLIT (M_PI) : 0, __imag__ x); 52 else 53 __imag__ res = M_NAN; 54 } 55 else 56 { 57 __real__ res = M_NAN; 58 if (rcls == FP_ZERO) 59 __imag__ res = M_MLIT (M_PI_2); 60 else 61 __imag__ res = M_NAN; 62 } 63 } 64 else if (rcls == FP_ZERO && icls == FP_ZERO) 65 { 66 __real__ res = 0; 67 __imag__ res = M_COPYSIGN (M_MLIT (M_PI_2), __imag__ x); 68 } 69 else 70 { 71 CFLOAT y; 72 73 __real__ y = -__imag__ x; 74 __imag__ y = __real__ x; 75 76 y = M_SUF (__kernel_casinh) (y, 1); 77 78 if (signbit (__imag__ x)) 79 { 80 __real__ res = __real__ y; 81 __imag__ res = -__imag__ y; 82 } 83 else 84 { 85 __real__ res = -__real__ y; 86 __imag__ res = __imag__ y; 87 } 88 } 89 90 return res; 91 } 92 93 declare_mgen_alias (__cacosh, cacosh) 94