(linenum→info "unix/slp.c:2238")

glibc/2.7/math/s_casinh.c

    1: /* Return arc hyperbole sine for double value.
    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 <math.h>
   23: 
   24: 
   25: __complex__ double
   26: __casinh (__complex__ double x)
   27: {
   28:   __complex__ double res;
   29:   int rcls = fpclassify (__real__ x);
   30:   int icls = fpclassify (__imag__ x);
   31: 
   32:   if (rcls <= FP_INFINITE || icls <= FP_INFINITE)
   33:     {
   34:       if (icls == FP_INFINITE)
   35:         {
   36:           __real__ res = __copysign (HUGE_VAL, __real__ x);
   37: 
   38:           if (rcls == FP_NAN)
   39:             __imag__ res = __nan ("");
   40:           else
   41:             __imag__ res = __copysign (rcls >= FP_ZERO ? M_PI_2 : M_PI_4,
   42:                                        __imag__ x);
   43:         }
   44:       else if (rcls <= FP_INFINITE)
   45:         {
   46:           __real__ res = __real__ x;
   47:           if ((rcls == FP_INFINITE && icls >= FP_ZERO)
   48:               || (rcls == FP_NAN && icls == FP_ZERO))
   49:             __imag__ res = __copysign (0.0, __imag__ x);
   50:           else
   51:             __imag__ res = __nan ("");
   52:         }
   53:       else
   54:         {
   55:           __real__ res = __nan ("");
   56:           __imag__ res = __nan ("");
   57:         }
   58:     }
   59:   else if (rcls == FP_ZERO && icls == FP_ZERO)
   60:     {
   61:       res = x;
   62:     }
   63:   else
   64:     {
   65:       __complex__ double y;
   66: 
   67:       __real__ y = (__real__ x - __imag__ x) * (__real__ x + __imag__ x) + 1.0;
   68:       __imag__ y = 2.0 * __real__ x * __imag__ x;
   69: 
   70:       y = __csqrt (y);
   71: 
   72:       __real__ y += __real__ x;
   73:       __imag__ y += __imag__ x;
   74: 
   75:       res = __clog (y);
   76:     }
   77: 
   78:   return res;
   79: }
   80: weak_alias (__casinh, casinh)
   81: #ifdef NO_LONG_DOUBLE
   82: strong_alias (__casinh, __casinhl)
   83: weak_alias (__casinh, casinhl)
   84: #endif
Syntax (Markdown)