(root)/
glibc-2.38/
math/
s_cacosh_template.c
       1  /* Return arc hyperbolic cosine for a complex type.
       2     Copyright (C) 1997-2023 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
      24  M_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)