Home | History | Annotate | Line # | Download | only in math
      1 /* Return arc hyperbolic sine for a complex float 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 (at) 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 casinhq (__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 = copysignq (HUGE_VALQ, __real__ x);
     34 
     35 	  if (rcls == QUADFP_NAN)
     36 	    __imag__ res = nanq ("");
     37 	  else
     38 	    __imag__ res = copysignq ((rcls >= QUADFP_ZERO
     39 				        ? M_PI_2q : M_PI_4q),
     40 				       __imag__ x);
     41 	}
     42       else if (rcls <= QUADFP_INFINITE)
     43 	{
     44 	  __real__ res = __real__ x;
     45 	  if ((rcls == QUADFP_INFINITE && icls >= QUADFP_ZERO)
     46 	      || (rcls == QUADFP_NAN && icls == QUADFP_ZERO))
     47 	    __imag__ res = copysignq (0, __imag__ x);
     48 	  else
     49 	    __imag__ res = nanq ("");
     50 	}
     51       else
     52 	{
     53 	  __real__ res = nanq ("");
     54 	  __imag__ res = nanq ("");
     55 	}
     56     }
     57   else if (rcls == QUADFP_ZERO && icls == QUADFP_ZERO)
     58     {
     59       res = x;
     60     }
     61   else
     62     {
     63       res = __quadmath_kernel_casinhq (x, 0);
     64     }
     65 
     66   return res;
     67 }
     68