xref: /haiku/src/system/libroot/posix/glibc/arch/generic/s_cacoshf.c (revision 24159a0c7d6d6dcba9f2a0c1a7c08d2c8167f21b)
1 /* Return arc hyperbole cosine for float 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 #include "math_private.h"
25 
26 __complex__ float
27 __cacoshf (__complex__ float x)
28 {
29   __complex__ float res;
30   int rcls = fpclassify (__real__ x);
31   int icls = fpclassify (__imag__ x);
32 
33   if (rcls <= FP_INFINITE || icls <= FP_INFINITE)
34     {
35       if (icls == FP_INFINITE)
36 	{
37 	  __real__ res = HUGE_VALF;
38 
39 	  if (rcls == FP_NAN)
40 	    __imag__ res = __nanf ("");
41 	  else
42 	    __imag__ res = __copysignf ((rcls == FP_INFINITE
43 					 ? (__real__ x < 0.0
44 					    ? M_PI - M_PI_4 : M_PI_4)
45 					 : M_PI_2), __imag__ x);
46 	}
47       else if (rcls == FP_INFINITE)
48 	{
49 	  __real__ res = HUGE_VALF;
50 
51 	  if (icls >= FP_ZERO)
52 	    __imag__ res = __copysignf (signbit (__real__ x) ? M_PI : 0.0,
53 					__imag__ x);
54 	  else
55 	    __imag__ res = __nanf ("");
56 	}
57       else
58 	{
59 	  __real__ res = __nanf ("");
60 	  __imag__ res = __nanf ("");
61 	}
62     }
63   else if (rcls == FP_ZERO && icls == FP_ZERO)
64     {
65       __real__ res = 0.0;
66       __imag__ res = __copysignf (M_PI_2, __imag__ x);
67     }
68   else
69     {
70 #if 1
71       __complex__ float y;
72 
73       __real__ y = (__real__ x - __imag__ x) * (__real__ x + __imag__ x) - 1.0;
74       __imag__ y = 2.0 * __real__ x * __imag__ x;
75 
76       y = __csqrtf (y);
77 
78       __real__ y += __real__ x;
79       __imag__ y += __imag__ x;
80 
81       res = __clogf (y);
82 #else
83       float re2 = __real__ x * __real__ x;
84       float im2 = __imag__ x * __imag__ x;
85       float sq = re2 - im2 - 1.0;
86       float ro = __ieee754_sqrtf (sq * sq + 4 * re2 * im2);
87       float a = __ieee754_sqrtf ((sq + ro) / 2.0);
88       float b = __ieee754_sqrtf ((-sq + ro) / 2.0);
89 
90       __real__ res = 0.5 * __ieee754_logf (re2 + __real__ x * 2 * a
91 					   + im2 + __imag__ x * 2 * b
92 					   + ro);
93       __imag__ res = __ieee754_atan2f (__imag__ x + b, __real__ x + a);
94 #endif
95     }
96 
97   return res;
98 }
99 #ifndef __cacoshf
100 weak_alias (__cacoshf, cacoshf)
101 #endif
102