Back to index

glibc  2.9
s_cacoshl.c
Go to the documentation of this file.
00001 /* Return arc hyperbole cosine for long double value.
00002    Copyright (C) 1997, 1998, 2006 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
00005 
00006    The GNU C Library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public
00008    License as published by the Free Software Foundation; either
00009    version 2.1 of the License, or (at your option) any later version.
00010 
00011    The GNU C Library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with the GNU C Library; if not, write to the Free
00018    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00019    02111-1307 USA.  */
00020 
00021 #include <complex.h>
00022 #include <math.h>
00023 
00024 
00025 __complex__ long double
00026 __cacoshl (__complex__ long double x)
00027 {
00028   __complex__ long double res;
00029   int rcls = fpclassify (__real__ x);
00030   int icls = fpclassify (__imag__ x);
00031 
00032   if (rcls <= FP_INFINITE || icls <= FP_INFINITE)
00033     {
00034       if (icls == FP_INFINITE)
00035        {
00036          __real__ res = HUGE_VALL;
00037 
00038          if (rcls == FP_NAN)
00039            __imag__ res = __nanl ("");
00040          else
00041            __imag__ res = __copysignl ((rcls == FP_INFINITE
00042                                     ? (__real__ x < 0.0
00043                                        ? M_PIl - M_PI_4l : M_PI_4l)
00044                                     : M_PI_2l), __imag__ x);
00045        }
00046       else if (rcls == FP_INFINITE)
00047        {
00048          __real__ res = HUGE_VALL;
00049 
00050          if (icls >= FP_ZERO)
00051            __imag__ res = __copysignl (signbit (__real__ x) ? M_PIl : 0.0,
00052                                    __imag__ x);
00053          else
00054            __imag__ res = __nanl ("");
00055        }
00056       else
00057        {
00058          __real__ res = __nanl ("");
00059          __imag__ res = __nanl ("");
00060        }
00061     }
00062   else if (rcls == FP_ZERO && icls == FP_ZERO)
00063     {
00064       __real__ res = 0.0;
00065       __imag__ res = __copysignl (M_PI_2l, __imag__ x);
00066     }
00067   else
00068     {
00069       __complex__ long double y;
00070 
00071       __real__ y = (__real__ x - __imag__ x) * (__real__ x + __imag__ x) - 1.0;
00072       __imag__ y = 2.0 * __real__ x * __imag__ x;
00073 
00074       y = __csqrtl (y);
00075 
00076       if (__real__ x < 0.0)
00077        y = -y;
00078 
00079       __real__ y += __real__ x;
00080       __imag__ y += __imag__ x;
00081 
00082       res = __clogl (y);
00083 
00084       /* We have to use the positive branch.  */
00085       if (__real__ res < 0.0)
00086        res = -res;
00087     }
00088 
00089   return res;
00090 }
00091 weak_alias (__cacoshl, cacoshl)