Back to index

glibc  2.9
s_catanhf.c
Go to the documentation of this file.
00001 /* Return arc hyperbole tangent for float value.
00002    Copyright (C) 1997 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 #include "math_private.h"
00025 
00026 
00027 __complex__ float
00028 __catanhf (__complex__ float x)
00029 {
00030   __complex__ float res;
00031   int rcls = fpclassify (__real__ x);
00032   int icls = fpclassify (__imag__ x);
00033 
00034   if (rcls <= FP_INFINITE || icls <= FP_INFINITE)
00035     {
00036       if (icls == FP_INFINITE)
00037        {
00038          __real__ res = __copysignf (0.0, __real__ x);
00039          __imag__ res = __copysignf (M_PI_2, __imag__ x);
00040        }
00041       else if (rcls == FP_INFINITE || rcls == FP_ZERO)
00042        {
00043          __real__ res = __copysignf (0.0, __real__ x);
00044          if (icls >= FP_ZERO)
00045            __imag__ res = __copysignf (M_PI_2, __imag__ x);
00046          else
00047            __imag__ res = __nanf ("");
00048        }
00049       else
00050        {
00051          __real__ res = __nanf ("");
00052          __imag__ res = __nanf ("");
00053        }
00054     }
00055   else if (rcls == FP_ZERO && icls == FP_ZERO)
00056     {
00057       res = x;
00058     }
00059   else
00060     {
00061       float i2, num, den;
00062 
00063       i2 = __imag__ x * __imag__ x;
00064 
00065       num = 1.0 + __real__ x;
00066       num = i2 + num * num;
00067 
00068       den = 1.0 - __real__ x;
00069       den = i2 + den * den;
00070 
00071       __real__ res = 0.25 * (__ieee754_logf (num) - __ieee754_logf (den));
00072 
00073       den = 1 - __real__ x * __real__ x - i2;
00074 
00075       __imag__ res = 0.5 * __ieee754_atan2f (2.0 * __imag__ x, den);
00076     }
00077 
00078   return res;
00079 }
00080 #ifndef __catanhf
00081 weak_alias (__catanhf, catanhf)
00082 #endif