(root)/
gcc-13.2.0/
libquadmath/
math/
cacoshq.c
       1  /* Return arc hyperbolic cosine for a complex type.
       2     Copyright (C) 1997-2018 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, see
      18     <http://www.gnu.org/licenses/>.  */
      19  
      20  #include "quadmath-imp.h"
      21  
      22  __complex128
      23  cacoshq (__complex128 x)
      24  {
      25    __complex128 res;
      26    int rcls = fpclassifyq (__real__ x);
      27    int icls = fpclassifyq (__imag__ x);
      28  
      29    if (rcls <= QUADFP_INFINITE || icls <= QUADFP_INFINITE)
      30      {
      31        if (icls == QUADFP_INFINITE)
      32  	{
      33  	  __real__ res = HUGE_VALQ;
      34  
      35  	  if (rcls == QUADFP_NAN)
      36  	    __imag__ res = nanq ("");
      37  	  else
      38  	    __imag__ res = copysignq ((rcls == QUADFP_INFINITE
      39  					? (__real__ x < 0
      40  					   ? M_PIq - M_PI_4q
      41  					   : M_PI_4q)
      42  					: M_PI_2q), __imag__ x);
      43  	}
      44        else if (rcls == QUADFP_INFINITE)
      45  	{
      46  	  __real__ res = HUGE_VALQ;
      47  
      48  	  if (icls >= QUADFP_ZERO)
      49  	    __imag__ res = copysignq (signbitq (__real__ x)
      50  				       ? M_PIq : 0, __imag__ x);
      51  	  else
      52  	    __imag__ res = nanq ("");
      53  	}
      54        else
      55  	{
      56  	  __real__ res = nanq ("");
      57  	  if (rcls == QUADFP_ZERO)
      58  	    __imag__ res = M_PI_2q;
      59  	  else
      60  	    __imag__ res = nanq ("");
      61  	}
      62      }
      63    else if (rcls == QUADFP_ZERO && icls == QUADFP_ZERO)
      64      {
      65        __real__ res = 0;
      66        __imag__ res = copysignq (M_PI_2q, __imag__ x);
      67      }
      68    else
      69      {
      70        __complex128 y;
      71  
      72        __real__ y = -__imag__ x;
      73        __imag__ y = __real__ x;
      74  
      75        y = __quadmath_kernel_casinhq (y, 1);
      76  
      77        if (signbitq (__imag__ x))
      78  	{
      79  	  __real__ res = __real__ y;
      80  	  __imag__ res = -__imag__ y;
      81  	}
      82        else
      83  	{
      84  	  __real__ res = -__real__ y;
      85  	  __imag__ res = __imag__ y;
      86  	}
      87      }
      88  
      89    return res;
      90  }