xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/tr1/complex (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino// TR1 complex -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino// Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
4*e4b17023SJohn Marino// Free Software Foundation, Inc.
5*e4b17023SJohn Marino//
6*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino// terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino// any later version.
11*e4b17023SJohn Marino
12*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino// GNU General Public License for more details.
16*e4b17023SJohn Marino
17*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino
21*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino
26*e4b17023SJohn Marino/** @file tr1/complex
27*e4b17023SJohn Marino *  This is a TR1 C++ Library header.
28*e4b17023SJohn Marino */
29*e4b17023SJohn Marino
30*e4b17023SJohn Marino#ifndef _GLIBCXX_TR1_COMPLEX
31*e4b17023SJohn Marino#define _GLIBCXX_TR1_COMPLEX 1
32*e4b17023SJohn Marino
33*e4b17023SJohn Marino#pragma GCC system_header
34*e4b17023SJohn Marino
35*e4b17023SJohn Marino#include <complex>
36*e4b17023SJohn Marino
37*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
38*e4b17023SJohn Marino{
39*e4b17023SJohn Marinonamespace tr1
40*e4b17023SJohn Marino{
41*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
42*e4b17023SJohn Marino
43*e4b17023SJohn Marino  /**
44*e4b17023SJohn Marino   * @addtogroup complex_numbers
45*e4b17023SJohn Marino   * @{
46*e4b17023SJohn Marino   */
47*e4b17023SJohn Marino
48*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
49*e4b17023SJohn Marino  using std::acos;
50*e4b17023SJohn Marino  using std::asin;
51*e4b17023SJohn Marino  using std::atan;
52*e4b17023SJohn Marino#else
53*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&);
54*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&);
55*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&);
56*e4b17023SJohn Marino#endif
57*e4b17023SJohn Marino
58*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&);
59*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&);
60*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&);
61*e4b17023SJohn Marino
62*e4b17023SJohn Marino  // The std::fabs return type in C++0x mode is different (just _Tp).
63*e4b17023SJohn Marino  template<typename _Tp> std::complex<_Tp> fabs(const std::complex<_Tp>&);
64*e4b17023SJohn Marino
65*e4b17023SJohn Marino#ifndef __GXX_EXPERIMENTAL_CXX0X__
66*e4b17023SJohn Marino  template<typename _Tp>
67*e4b17023SJohn Marino    inline std::complex<_Tp>
68*e4b17023SJohn Marino    __complex_acos(const std::complex<_Tp>& __z)
69*e4b17023SJohn Marino    {
70*e4b17023SJohn Marino      const std::complex<_Tp> __t = std::tr1::asin(__z);
71*e4b17023SJohn Marino      const _Tp __pi_2 = 1.5707963267948966192313216916397514L;
72*e4b17023SJohn Marino      return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
73*e4b17023SJohn Marino    }
74*e4b17023SJohn Marino
75*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_COMPLEX_TR1
76*e4b17023SJohn Marino  inline __complex__ float
77*e4b17023SJohn Marino  __complex_acos(__complex__ float __z)
78*e4b17023SJohn Marino  { return __builtin_cacosf(__z); }
79*e4b17023SJohn Marino
80*e4b17023SJohn Marino  inline __complex__ double
81*e4b17023SJohn Marino  __complex_acos(__complex__ double __z)
82*e4b17023SJohn Marino  { return __builtin_cacos(__z); }
83*e4b17023SJohn Marino
84*e4b17023SJohn Marino  inline __complex__ long double
85*e4b17023SJohn Marino  __complex_acos(const __complex__ long double& __z)
86*e4b17023SJohn Marino  { return __builtin_cacosl(__z); }
87*e4b17023SJohn Marino
88*e4b17023SJohn Marino  template<typename _Tp>
89*e4b17023SJohn Marino    inline std::complex<_Tp>
90*e4b17023SJohn Marino    acos(const std::complex<_Tp>& __z)
91*e4b17023SJohn Marino    { return __complex_acos(__z.__rep()); }
92*e4b17023SJohn Marino#else
93*e4b17023SJohn Marino  /// acos(__z) [8.1.2].
94*e4b17023SJohn Marino  //  Effects:  Behaves the same as C99 function cacos, defined
95*e4b17023SJohn Marino  //            in subclause 7.3.5.1.
96*e4b17023SJohn Marino  template<typename _Tp>
97*e4b17023SJohn Marino    inline std::complex<_Tp>
98*e4b17023SJohn Marino    acos(const std::complex<_Tp>& __z)
99*e4b17023SJohn Marino    { return __complex_acos(__z); }
100*e4b17023SJohn Marino#endif
101*e4b17023SJohn Marino
102*e4b17023SJohn Marino  template<typename _Tp>
103*e4b17023SJohn Marino    inline std::complex<_Tp>
104*e4b17023SJohn Marino    __complex_asin(const std::complex<_Tp>& __z)
105*e4b17023SJohn Marino    {
106*e4b17023SJohn Marino      std::complex<_Tp> __t(-__z.imag(), __z.real());
107*e4b17023SJohn Marino      __t = std::tr1::asinh(__t);
108*e4b17023SJohn Marino      return std::complex<_Tp>(__t.imag(), -__t.real());
109*e4b17023SJohn Marino    }
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_COMPLEX_TR1
112*e4b17023SJohn Marino  inline __complex__ float
113*e4b17023SJohn Marino  __complex_asin(__complex__ float __z)
114*e4b17023SJohn Marino  { return __builtin_casinf(__z); }
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino  inline __complex__ double
117*e4b17023SJohn Marino  __complex_asin(__complex__ double __z)
118*e4b17023SJohn Marino  { return __builtin_casin(__z); }
119*e4b17023SJohn Marino
120*e4b17023SJohn Marino  inline __complex__ long double
121*e4b17023SJohn Marino  __complex_asin(const __complex__ long double& __z)
122*e4b17023SJohn Marino  { return __builtin_casinl(__z); }
123*e4b17023SJohn Marino
124*e4b17023SJohn Marino  template<typename _Tp>
125*e4b17023SJohn Marino    inline std::complex<_Tp>
126*e4b17023SJohn Marino    asin(const std::complex<_Tp>& __z)
127*e4b17023SJohn Marino    { return __complex_asin(__z.__rep()); }
128*e4b17023SJohn Marino#else
129*e4b17023SJohn Marino  /// asin(__z) [8.1.3].
130*e4b17023SJohn Marino  //  Effects:  Behaves the same as C99 function casin, defined
131*e4b17023SJohn Marino  //            in subclause 7.3.5.2.
132*e4b17023SJohn Marino  template<typename _Tp>
133*e4b17023SJohn Marino    inline std::complex<_Tp>
134*e4b17023SJohn Marino    asin(const std::complex<_Tp>& __z)
135*e4b17023SJohn Marino    { return __complex_asin(__z); }
136*e4b17023SJohn Marino#endif
137*e4b17023SJohn Marino
138*e4b17023SJohn Marino  template<typename _Tp>
139*e4b17023SJohn Marino    std::complex<_Tp>
140*e4b17023SJohn Marino    __complex_atan(const std::complex<_Tp>& __z)
141*e4b17023SJohn Marino    {
142*e4b17023SJohn Marino      const _Tp __r2 = __z.real() * __z.real();
143*e4b17023SJohn Marino      const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
144*e4b17023SJohn Marino
145*e4b17023SJohn Marino      _Tp __num = __z.imag() + _Tp(1.0);
146*e4b17023SJohn Marino      _Tp __den = __z.imag() - _Tp(1.0);
147*e4b17023SJohn Marino
148*e4b17023SJohn Marino      __num = __r2 + __num * __num;
149*e4b17023SJohn Marino      __den = __r2 + __den * __den;
150*e4b17023SJohn Marino
151*e4b17023SJohn Marino      return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x),
152*e4b17023SJohn Marino			       _Tp(0.25) * log(__num / __den));
153*e4b17023SJohn Marino    }
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_COMPLEX_TR1
156*e4b17023SJohn Marino  inline __complex__ float
157*e4b17023SJohn Marino  __complex_atan(__complex__ float __z)
158*e4b17023SJohn Marino  { return __builtin_catanf(__z); }
159*e4b17023SJohn Marino
160*e4b17023SJohn Marino  inline __complex__ double
161*e4b17023SJohn Marino  __complex_atan(__complex__ double __z)
162*e4b17023SJohn Marino  { return __builtin_catan(__z); }
163*e4b17023SJohn Marino
164*e4b17023SJohn Marino  inline __complex__ long double
165*e4b17023SJohn Marino  __complex_atan(const __complex__ long double& __z)
166*e4b17023SJohn Marino  { return __builtin_catanl(__z); }
167*e4b17023SJohn Marino
168*e4b17023SJohn Marino  template<typename _Tp>
169*e4b17023SJohn Marino    inline std::complex<_Tp>
170*e4b17023SJohn Marino    atan(const std::complex<_Tp>& __z)
171*e4b17023SJohn Marino    { return __complex_atan(__z.__rep()); }
172*e4b17023SJohn Marino#else
173*e4b17023SJohn Marino  /// atan(__z) [8.1.4].
174*e4b17023SJohn Marino  //  Effects:  Behaves the same as C99 function catan, defined
175*e4b17023SJohn Marino  //            in subclause 7.3.5.3.
176*e4b17023SJohn Marino  template<typename _Tp>
177*e4b17023SJohn Marino    inline std::complex<_Tp>
178*e4b17023SJohn Marino    atan(const std::complex<_Tp>& __z)
179*e4b17023SJohn Marino    { return __complex_atan(__z); }
180*e4b17023SJohn Marino#endif
181*e4b17023SJohn Marino
182*e4b17023SJohn Marino#endif // __GXX_EXPERIMENTAL_CXX0X__
183*e4b17023SJohn Marino
184*e4b17023SJohn Marino  template<typename _Tp>
185*e4b17023SJohn Marino    std::complex<_Tp>
186*e4b17023SJohn Marino    __complex_acosh(const std::complex<_Tp>& __z)
187*e4b17023SJohn Marino    {
188*e4b17023SJohn Marino      // Kahan's formula.
189*e4b17023SJohn Marino      return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0)))
190*e4b17023SJohn Marino				 + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
191*e4b17023SJohn Marino    }
192*e4b17023SJohn Marino
193*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_COMPLEX_TR1
194*e4b17023SJohn Marino  inline __complex__ float
195*e4b17023SJohn Marino  __complex_acosh(__complex__ float __z)
196*e4b17023SJohn Marino  { return __builtin_cacoshf(__z); }
197*e4b17023SJohn Marino
198*e4b17023SJohn Marino  inline __complex__ double
199*e4b17023SJohn Marino  __complex_acosh(__complex__ double __z)
200*e4b17023SJohn Marino  { return __builtin_cacosh(__z); }
201*e4b17023SJohn Marino
202*e4b17023SJohn Marino  inline __complex__ long double
203*e4b17023SJohn Marino  __complex_acosh(const __complex__ long double& __z)
204*e4b17023SJohn Marino  { return __builtin_cacoshl(__z); }
205*e4b17023SJohn Marino
206*e4b17023SJohn Marino  template<typename _Tp>
207*e4b17023SJohn Marino    inline std::complex<_Tp>
208*e4b17023SJohn Marino    acosh(const std::complex<_Tp>& __z)
209*e4b17023SJohn Marino    { return __complex_acosh(__z.__rep()); }
210*e4b17023SJohn Marino#else
211*e4b17023SJohn Marino  /// acosh(__z) [8.1.5].
212*e4b17023SJohn Marino  //  Effects:  Behaves the same as C99 function cacosh, defined
213*e4b17023SJohn Marino  //            in subclause 7.3.6.1.
214*e4b17023SJohn Marino  template<typename _Tp>
215*e4b17023SJohn Marino    inline std::complex<_Tp>
216*e4b17023SJohn Marino    acosh(const std::complex<_Tp>& __z)
217*e4b17023SJohn Marino    { return __complex_acosh(__z); }
218*e4b17023SJohn Marino#endif
219*e4b17023SJohn Marino
220*e4b17023SJohn Marino  template<typename _Tp>
221*e4b17023SJohn Marino    std::complex<_Tp>
222*e4b17023SJohn Marino    __complex_asinh(const std::complex<_Tp>& __z)
223*e4b17023SJohn Marino    {
224*e4b17023SJohn Marino      std::complex<_Tp> __t((__z.real() - __z.imag())
225*e4b17023SJohn Marino			    * (__z.real() + __z.imag()) + _Tp(1.0),
226*e4b17023SJohn Marino			    _Tp(2.0) * __z.real() * __z.imag());
227*e4b17023SJohn Marino      __t = std::sqrt(__t);
228*e4b17023SJohn Marino
229*e4b17023SJohn Marino      return std::log(__t + __z);
230*e4b17023SJohn Marino    }
231*e4b17023SJohn Marino
232*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_COMPLEX_TR1
233*e4b17023SJohn Marino  inline __complex__ float
234*e4b17023SJohn Marino  __complex_asinh(__complex__ float __z)
235*e4b17023SJohn Marino  { return __builtin_casinhf(__z); }
236*e4b17023SJohn Marino
237*e4b17023SJohn Marino  inline __complex__ double
238*e4b17023SJohn Marino  __complex_asinh(__complex__ double __z)
239*e4b17023SJohn Marino  { return __builtin_casinh(__z); }
240*e4b17023SJohn Marino
241*e4b17023SJohn Marino  inline __complex__ long double
242*e4b17023SJohn Marino  __complex_asinh(const __complex__ long double& __z)
243*e4b17023SJohn Marino  { return __builtin_casinhl(__z); }
244*e4b17023SJohn Marino
245*e4b17023SJohn Marino  template<typename _Tp>
246*e4b17023SJohn Marino    inline std::complex<_Tp>
247*e4b17023SJohn Marino    asinh(const std::complex<_Tp>& __z)
248*e4b17023SJohn Marino    { return __complex_asinh(__z.__rep()); }
249*e4b17023SJohn Marino#else
250*e4b17023SJohn Marino  /// asinh(__z) [8.1.6].
251*e4b17023SJohn Marino  //  Effects:  Behaves the same as C99 function casin, defined
252*e4b17023SJohn Marino  //            in subclause 7.3.6.2.
253*e4b17023SJohn Marino  template<typename _Tp>
254*e4b17023SJohn Marino    inline std::complex<_Tp>
255*e4b17023SJohn Marino    asinh(const std::complex<_Tp>& __z)
256*e4b17023SJohn Marino    { return __complex_asinh(__z); }
257*e4b17023SJohn Marino#endif
258*e4b17023SJohn Marino
259*e4b17023SJohn Marino  template<typename _Tp>
260*e4b17023SJohn Marino    std::complex<_Tp>
261*e4b17023SJohn Marino    __complex_atanh(const std::complex<_Tp>& __z)
262*e4b17023SJohn Marino    {
263*e4b17023SJohn Marino      const _Tp __i2 = __z.imag() * __z.imag();
264*e4b17023SJohn Marino      const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
265*e4b17023SJohn Marino
266*e4b17023SJohn Marino      _Tp __num = _Tp(1.0) + __z.real();
267*e4b17023SJohn Marino      _Tp __den = _Tp(1.0) - __z.real();
268*e4b17023SJohn Marino
269*e4b17023SJohn Marino      __num = __i2 + __num * __num;
270*e4b17023SJohn Marino      __den = __i2 + __den * __den;
271*e4b17023SJohn Marino
272*e4b17023SJohn Marino      return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)),
273*e4b17023SJohn Marino			       _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
274*e4b17023SJohn Marino    }
275*e4b17023SJohn Marino
276*e4b17023SJohn Marino#if _GLIBCXX_USE_C99_COMPLEX_TR1
277*e4b17023SJohn Marino  inline __complex__ float
278*e4b17023SJohn Marino  __complex_atanh(__complex__ float __z)
279*e4b17023SJohn Marino  { return __builtin_catanhf(__z); }
280*e4b17023SJohn Marino
281*e4b17023SJohn Marino  inline __complex__ double
282*e4b17023SJohn Marino  __complex_atanh(__complex__ double __z)
283*e4b17023SJohn Marino  { return __builtin_catanh(__z); }
284*e4b17023SJohn Marino
285*e4b17023SJohn Marino  inline __complex__ long double
286*e4b17023SJohn Marino  __complex_atanh(const __complex__ long double& __z)
287*e4b17023SJohn Marino  { return __builtin_catanhl(__z); }
288*e4b17023SJohn Marino
289*e4b17023SJohn Marino  template<typename _Tp>
290*e4b17023SJohn Marino    inline std::complex<_Tp>
291*e4b17023SJohn Marino    atanh(const std::complex<_Tp>& __z)
292*e4b17023SJohn Marino    { return __complex_atanh(__z.__rep()); }
293*e4b17023SJohn Marino#else
294*e4b17023SJohn Marino  /// atanh(__z) [8.1.7].
295*e4b17023SJohn Marino  //  Effects:  Behaves the same as C99 function catanh, defined
296*e4b17023SJohn Marino  //            in subclause 7.3.6.3.
297*e4b17023SJohn Marino  template<typename _Tp>
298*e4b17023SJohn Marino    inline std::complex<_Tp>
299*e4b17023SJohn Marino    atanh(const std::complex<_Tp>& __z)
300*e4b17023SJohn Marino    { return __complex_atanh(__z); }
301*e4b17023SJohn Marino#endif
302*e4b17023SJohn Marino
303*e4b17023SJohn Marino  template<typename _Tp>
304*e4b17023SJohn Marino    inline std::complex<_Tp>
305*e4b17023SJohn Marino    /// fabs(__z) [8.1.8].
306*e4b17023SJohn Marino    //  Effects:  Behaves the same as C99 function cabs, defined
307*e4b17023SJohn Marino    //            in subclause 7.3.8.1.
308*e4b17023SJohn Marino    fabs(const std::complex<_Tp>& __z)
309*e4b17023SJohn Marino    { return std::abs(__z); }
310*e4b17023SJohn Marino
311*e4b17023SJohn Marino  /// Additional overloads [8.1.9].
312*e4b17023SJohn Marino#ifndef __GXX_EXPERIMENTAL_CXX0X__
313*e4b17023SJohn Marino
314*e4b17023SJohn Marino  template<typename _Tp>
315*e4b17023SJohn Marino    inline typename __gnu_cxx::__promote<_Tp>::__type
316*e4b17023SJohn Marino    arg(_Tp __x)
317*e4b17023SJohn Marino    {
318*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
319*e4b17023SJohn Marino#if (_GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC)
320*e4b17023SJohn Marino      return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L)
321*e4b17023SJohn Marino	                       : __type();
322*e4b17023SJohn Marino#else
323*e4b17023SJohn Marino      return std::arg(std::complex<__type>(__x));
324*e4b17023SJohn Marino#endif
325*e4b17023SJohn Marino    }
326*e4b17023SJohn Marino
327*e4b17023SJohn Marino  template<typename _Tp>
328*e4b17023SJohn Marino    inline typename __gnu_cxx::__promote<_Tp>::__type
329*e4b17023SJohn Marino    imag(_Tp)
330*e4b17023SJohn Marino    { return _Tp(); }
331*e4b17023SJohn Marino
332*e4b17023SJohn Marino  template<typename _Tp>
333*e4b17023SJohn Marino    inline typename __gnu_cxx::__promote<_Tp>::__type
334*e4b17023SJohn Marino    norm(_Tp __x)
335*e4b17023SJohn Marino    {
336*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
337*e4b17023SJohn Marino      return __type(__x) * __type(__x);
338*e4b17023SJohn Marino    }
339*e4b17023SJohn Marino
340*e4b17023SJohn Marino  template<typename _Tp>
341*e4b17023SJohn Marino    inline typename __gnu_cxx::__promote<_Tp>::__type
342*e4b17023SJohn Marino    real(_Tp __x)
343*e4b17023SJohn Marino    { return __x; }
344*e4b17023SJohn Marino
345*e4b17023SJohn Marino#endif
346*e4b17023SJohn Marino
347*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
348*e4b17023SJohn Marino    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
349*e4b17023SJohn Marino    pow(const std::complex<_Tp>& __x, const _Up& __y)
350*e4b17023SJohn Marino    {
351*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
352*e4b17023SJohn Marino      return std::pow(std::complex<__type>(__x), __type(__y));
353*e4b17023SJohn Marino    }
354*e4b17023SJohn Marino
355*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
356*e4b17023SJohn Marino    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
357*e4b17023SJohn Marino    pow(const _Tp& __x, const std::complex<_Up>& __y)
358*e4b17023SJohn Marino    {
359*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
360*e4b17023SJohn Marino      return std::pow(__type(__x), std::complex<__type>(__y));
361*e4b17023SJohn Marino    }
362*e4b17023SJohn Marino
363*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
364*e4b17023SJohn Marino    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
365*e4b17023SJohn Marino    pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y)
366*e4b17023SJohn Marino    {
367*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
368*e4b17023SJohn Marino      return std::pow(std::complex<__type>(__x),
369*e4b17023SJohn Marino		      std::complex<__type>(__y));
370*e4b17023SJohn Marino    }
371*e4b17023SJohn Marino
372*e4b17023SJohn Marino  using std::arg;
373*e4b17023SJohn Marino
374*e4b17023SJohn Marino  template<typename _Tp>
375*e4b17023SJohn Marino    inline std::complex<_Tp>
376*e4b17023SJohn Marino    conj(const std::complex<_Tp>& __z)
377*e4b17023SJohn Marino    { return std::conj(__z); }
378*e4b17023SJohn Marino
379*e4b17023SJohn Marino  template<typename _Tp>
380*e4b17023SJohn Marino    inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
381*e4b17023SJohn Marino    conj(_Tp __x)
382*e4b17023SJohn Marino    { return __x; }
383*e4b17023SJohn Marino
384*e4b17023SJohn Marino  using std::imag;
385*e4b17023SJohn Marino  using std::norm;
386*e4b17023SJohn Marino  using std::polar;
387*e4b17023SJohn Marino
388*e4b17023SJohn Marino  template<typename _Tp, typename _Up>
389*e4b17023SJohn Marino    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
390*e4b17023SJohn Marino    polar(const _Tp& __rho, const _Up& __theta)
391*e4b17023SJohn Marino    {
392*e4b17023SJohn Marino      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
393*e4b17023SJohn Marino      return std::polar(__type(__rho), __type(__theta));
394*e4b17023SJohn Marino    }
395*e4b17023SJohn Marino
396*e4b17023SJohn Marino  using std::real;
397*e4b17023SJohn Marino
398*e4b17023SJohn Marino  template<typename _Tp>
399*e4b17023SJohn Marino    inline std::complex<_Tp>
400*e4b17023SJohn Marino    pow(const std::complex<_Tp>& __x, const _Tp& __y)
401*e4b17023SJohn Marino    { return std::pow(__x, __y); }
402*e4b17023SJohn Marino
403*e4b17023SJohn Marino  template<typename _Tp>
404*e4b17023SJohn Marino    inline std::complex<_Tp>
405*e4b17023SJohn Marino    pow(const _Tp& __x, const std::complex<_Tp>& __y)
406*e4b17023SJohn Marino    { return std::pow(__x, __y); }
407*e4b17023SJohn Marino
408*e4b17023SJohn Marino  template<typename _Tp>
409*e4b17023SJohn Marino    inline std::complex<_Tp>
410*e4b17023SJohn Marino    pow(const std::complex<_Tp>& __x, const std::complex<_Tp>& __y)
411*e4b17023SJohn Marino    { return std::pow(__x, __y); }
412*e4b17023SJohn Marino
413*e4b17023SJohn Marino// @} group complex_numbers
414*e4b17023SJohn Marino
415*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
416*e4b17023SJohn Marino}
417*e4b17023SJohn Marino}
418*e4b17023SJohn Marino
419*e4b17023SJohn Marino#endif // _GLIBCXX_TR1_COMPLEX
420