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