Remove building with NOCRYPTO option
[minix.git] / external / bsd / libc++ / dist / libcxx / include / complex
blob2943da1d775ca50b7a546a5b68f06d9a1e7f9bd0
1 // -*- C++ -*-
2 //===--------------------------- complex ----------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
11 #ifndef _LIBCPP_COMPLEX
12 #define _LIBCPP_COMPLEX
15     complex synopsis
17 namespace std
20 template<class T>
21 class complex
23 public:
24     typedef T value_type;
26     complex(const T& re = T(), const T& im = T()); // constexpr in C++14
27     complex(const complex&);  // constexpr in C++14
28     template<class X> complex(const complex<X>&);  // constexpr in C++14
30     T real() const; // constexpr in C++14
31     T imag() const; // constexpr in C++14
33     void real(T);
34     void imag(T);
36     complex<T>& operator= (const T&);
37     complex<T>& operator+=(const T&);
38     complex<T>& operator-=(const T&);
39     complex<T>& operator*=(const T&);
40     complex<T>& operator/=(const T&);
42     complex& operator=(const complex&);
43     template<class X> complex<T>& operator= (const complex<X>&);
44     template<class X> complex<T>& operator+=(const complex<X>&);
45     template<class X> complex<T>& operator-=(const complex<X>&);
46     template<class X> complex<T>& operator*=(const complex<X>&);
47     template<class X> complex<T>& operator/=(const complex<X>&);
50 template<>
51 class complex<float>
53 public:
54     typedef float value_type;
56     constexpr complex(float re = 0.0f, float im = 0.0f);
57     explicit constexpr complex(const complex<double>&);
58     explicit constexpr complex(const complex<long double>&);
60     constexpr float real() const;
61     void real(float);
62     constexpr float imag() const;
63     void imag(float);
65     complex<float>& operator= (float);
66     complex<float>& operator+=(float);
67     complex<float>& operator-=(float);
68     complex<float>& operator*=(float);
69     complex<float>& operator/=(float);
71     complex<float>& operator=(const complex<float>&);
72     template<class X> complex<float>& operator= (const complex<X>&);
73     template<class X> complex<float>& operator+=(const complex<X>&);
74     template<class X> complex<float>& operator-=(const complex<X>&);
75     template<class X> complex<float>& operator*=(const complex<X>&);
76     template<class X> complex<float>& operator/=(const complex<X>&);
79 template<>
80 class complex<double>
82 public:
83     typedef double value_type;
85     constexpr complex(double re = 0.0, double im = 0.0);
86     constexpr complex(const complex<float>&);
87     explicit constexpr complex(const complex<long double>&);
89     constexpr double real() const;
90     void real(double);
91     constexpr double imag() const;
92     void imag(double);
94     complex<double>& operator= (double);
95     complex<double>& operator+=(double);
96     complex<double>& operator-=(double);
97     complex<double>& operator*=(double);
98     complex<double>& operator/=(double);
99     complex<double>& operator=(const complex<double>&);
101     template<class X> complex<double>& operator= (const complex<X>&);
102     template<class X> complex<double>& operator+=(const complex<X>&);
103     template<class X> complex<double>& operator-=(const complex<X>&);
104     template<class X> complex<double>& operator*=(const complex<X>&);
105     template<class X> complex<double>& operator/=(const complex<X>&);
108 template<>
109 class complex<long double>
111 public:
112     typedef long double value_type;
114     constexpr complex(long double re = 0.0L, long double im = 0.0L);
115     constexpr complex(const complex<float>&);
116     constexpr complex(const complex<double>&);
118     constexpr long double real() const;
119     void real(long double);
120     constexpr long double imag() const;
121     void imag(long double);
123     complex<long double>& operator=(const complex<long double>&);
124     complex<long double>& operator= (long double);
125     complex<long double>& operator+=(long double);
126     complex<long double>& operator-=(long double);
127     complex<long double>& operator*=(long double);
128     complex<long double>& operator/=(long double);
130     template<class X> complex<long double>& operator= (const complex<X>&);
131     template<class X> complex<long double>& operator+=(const complex<X>&);
132     template<class X> complex<long double>& operator-=(const complex<X>&);
133     template<class X> complex<long double>& operator*=(const complex<X>&);
134     template<class X> complex<long double>& operator/=(const complex<X>&);
137 // 26.3.6 operators:
138 template<class T> complex<T> operator+(const complex<T>&, const complex<T>&);
139 template<class T> complex<T> operator+(const complex<T>&, const T&);
140 template<class T> complex<T> operator+(const T&, const complex<T>&);
141 template<class T> complex<T> operator-(const complex<T>&, const complex<T>&);
142 template<class T> complex<T> operator-(const complex<T>&, const T&);
143 template<class T> complex<T> operator-(const T&, const complex<T>&);
144 template<class T> complex<T> operator*(const complex<T>&, const complex<T>&);
145 template<class T> complex<T> operator*(const complex<T>&, const T&);
146 template<class T> complex<T> operator*(const T&, const complex<T>&);
147 template<class T> complex<T> operator/(const complex<T>&, const complex<T>&);
148 template<class T> complex<T> operator/(const complex<T>&, const T&);
149 template<class T> complex<T> operator/(const T&, const complex<T>&);
150 template<class T> complex<T> operator+(const complex<T>&);
151 template<class T> complex<T> operator-(const complex<T>&);
152 template<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14
153 template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14
154 template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14
155 template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14
156 template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14
157 template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14
159 template<class T, class charT, class traits>
160   basic_istream<charT, traits>&
161   operator>>(basic_istream<charT, traits>&, complex<T>&);
162 template<class T, class charT, class traits>
163   basic_ostream<charT, traits>&
164   operator<<(basic_ostream<charT, traits>&, const complex<T>&);
166 // 26.3.7 values:
168 template<class T>              T real(const complex<T>&); // constexpr in C++14
169                      long double real(long double);       // constexpr in C++14
170                           double real(double);            // constexpr in C++14
171 template<Integral T>      double real(T);                 // constexpr in C++14
172                           float  real(float);             // constexpr in C++14
174 template<class T>              T imag(const complex<T>&); // constexpr in C++14
175                      long double imag(long double);       // constexpr in C++14
176                           double imag(double);            // constexpr in C++14
177 template<Integral T>      double imag(T);                 // constexpr in C++14
178                           float  imag(float);             // constexpr in C++14
180 template<class T> T abs(const complex<T>&);
182 template<class T>              T arg(const complex<T>&);
183                      long double arg(long double);
184                           double arg(double);
185 template<Integral T>      double arg(T);
186                           float  arg(float);
188 template<class T>              T norm(const complex<T>&);
189                      long double norm(long double);
190                           double norm(double);
191 template<Integral T>      double norm(T);
192                           float  norm(float);
194 template<class T>      complex<T>           conj(const complex<T>&);
195                        complex<long double> conj(long double);
196                        complex<double>      conj(double);
197 template<Integral T>   complex<double>      conj(T);
198                        complex<float>       conj(float);
200 template<class T>    complex<T>           proj(const complex<T>&);
201                      complex<long double> proj(long double);
202                      complex<double>      proj(double);
203 template<Integral T> complex<double>      proj(T);
204                      complex<float>       proj(float);
206 template<class T> complex<T> polar(const T&, const T& = 0);
208 // 26.3.8 transcendentals:
209 template<class T> complex<T> acos(const complex<T>&);
210 template<class T> complex<T> asin(const complex<T>&);
211 template<class T> complex<T> atan(const complex<T>&);
212 template<class T> complex<T> acosh(const complex<T>&);
213 template<class T> complex<T> asinh(const complex<T>&);
214 template<class T> complex<T> atanh(const complex<T>&);
215 template<class T> complex<T> cos (const complex<T>&);
216 template<class T> complex<T> cosh (const complex<T>&);
217 template<class T> complex<T> exp (const complex<T>&);
218 template<class T> complex<T> log (const complex<T>&);
219 template<class T> complex<T> log10(const complex<T>&);
221 template<class T> complex<T> pow(const complex<T>&, const T&);
222 template<class T> complex<T> pow(const complex<T>&, const complex<T>&);
223 template<class T> complex<T> pow(const T&, const complex<T>&);
225 template<class T> complex<T> sin (const complex<T>&);
226 template<class T> complex<T> sinh (const complex<T>&);
227 template<class T> complex<T> sqrt (const complex<T>&);
228 template<class T> complex<T> tan (const complex<T>&);
229 template<class T> complex<T> tanh (const complex<T>&);
231 template<class T, class charT, class traits>
232   basic_istream<charT, traits>&
233   operator>>(basic_istream<charT, traits>& is, complex<T>& x);
235 template<class T, class charT, class traits>
236   basic_ostream<charT, traits>&
237   operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
239 }  // std
243 #include <__config>
244 #include <type_traits>
245 #include <stdexcept>
246 #include <cmath>
247 #include <sstream>
248 #if defined(_LIBCPP_NO_EXCEPTIONS)
249     #include <cassert>
250 #endif
252 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
253 #pragma GCC system_header
254 #endif
256 _LIBCPP_BEGIN_NAMESPACE_STD
258 template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY complex;
260 template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w);
261 template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y);
263 template<class _Tp>
264 class _LIBCPP_TYPE_VIS_ONLY complex
266 public:
267     typedef _Tp value_type;
268 private:
269     value_type __re_;
270     value_type __im_;
271 public:
272     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
273     complex(const value_type& __re = value_type(), const value_type& __im = value_type())
274         : __re_(__re), __im_(__im) {}
275     template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
276     complex(const complex<_Xp>& __c)
277         : __re_(__c.real()), __im_(__c.imag()) {}
279     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;}
280     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;}
282     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
283     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
285     _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re)
286         {__re_ = __re; __im_ = value_type(); return *this;}
287     _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;}
288     _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;}
289     _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;}
290     _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;}
292     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
293         {
294             __re_ = __c.real();
295             __im_ = __c.imag();
296             return *this;
297         }
298     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
299         {
300             __re_ += __c.real();
301             __im_ += __c.imag();
302             return *this;
303         }
304     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
305         {
306             __re_ -= __c.real();
307             __im_ -= __c.imag();
308             return *this;
309         }
310     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
311         {
312             *this = *this * complex(__c.real(), __c.imag());
313             return *this;
314         }
315     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
316         {
317             *this = *this / complex(__c.real(), __c.imag());
318             return *this;
319         }
322 template<> class _LIBCPP_TYPE_VIS_ONLY complex<double>;
323 template<> class _LIBCPP_TYPE_VIS_ONLY complex<long double>;
325 template<>
326 class _LIBCPP_TYPE_VIS_ONLY complex<float>
328     float __re_;
329     float __im_;
330 public:
331     typedef float value_type;
333     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f)
334         : __re_(__re), __im_(__im) {}
335     explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
336     explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
338     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;}
339     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;}
341     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
342     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
344     _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re)
345         {__re_ = __re; __im_ = value_type(); return *this;}
346     _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;}
347     _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;}
348     _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;}
349     _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;}
351     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
352         {
353             __re_ = __c.real();
354             __im_ = __c.imag();
355             return *this;
356         }
357     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
358         {
359             __re_ += __c.real();
360             __im_ += __c.imag();
361             return *this;
362         }
363     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
364         {
365             __re_ -= __c.real();
366             __im_ -= __c.imag();
367             return *this;
368         }
369     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
370         {
371             *this = *this * complex(__c.real(), __c.imag());
372             return *this;
373         }
374     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
375         {
376             *this = *this / complex(__c.real(), __c.imag());
377             return *this;
378         }
381 template<>
382 class _LIBCPP_TYPE_VIS_ONLY complex<double>
384     double __re_;
385     double __im_;
386 public:
387     typedef double value_type;
389     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0)
390         : __re_(__re), __im_(__im) {}
391     _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
392     explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
394     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;}
395     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;}
397     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
398     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
400     _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re)
401         {__re_ = __re; __im_ = value_type(); return *this;}
402     _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;}
403     _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;}
404     _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;}
405     _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;}
407     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
408         {
409             __re_ = __c.real();
410             __im_ = __c.imag();
411             return *this;
412         }
413     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
414         {
415             __re_ += __c.real();
416             __im_ += __c.imag();
417             return *this;
418         }
419     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
420         {
421             __re_ -= __c.real();
422             __im_ -= __c.imag();
423             return *this;
424         }
425     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
426         {
427             *this = *this * complex(__c.real(), __c.imag());
428             return *this;
429         }
430     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
431         {
432             *this = *this / complex(__c.real(), __c.imag());
433             return *this;
434         }
437 template<>
438 class _LIBCPP_TYPE_VIS_ONLY complex<long double>
440     long double __re_;
441     long double __im_;
442 public:
443     typedef long double value_type;
445     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L)
446         : __re_(__re), __im_(__im) {}
447     _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
448     _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
450     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;}
451     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;}
453     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
454     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
456     _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re)
457         {__re_ = __re; __im_ = value_type(); return *this;}
458     _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;}
459     _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;}
460     _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;}
461     _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;}
463     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
464         {
465             __re_ = __c.real();
466             __im_ = __c.imag();
467             return *this;
468         }
469     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
470         {
471             __re_ += __c.real();
472             __im_ += __c.imag();
473             return *this;
474         }
475     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
476         {
477             __re_ -= __c.real();
478             __im_ -= __c.imag();
479             return *this;
480         }
481     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
482         {
483             *this = *this * complex(__c.real(), __c.imag());
484             return *this;
485         }
486     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
487         {
488             *this = *this / complex(__c.real(), __c.imag());
489             return *this;
490         }
493 inline _LIBCPP_INLINE_VISIBILITY
494 _LIBCPP_CONSTEXPR
495 complex<float>::complex(const complex<double>& __c)
496     : __re_(__c.real()), __im_(__c.imag()) {}
498 inline _LIBCPP_INLINE_VISIBILITY
499 _LIBCPP_CONSTEXPR
500 complex<float>::complex(const complex<long double>& __c)
501     : __re_(__c.real()), __im_(__c.imag()) {}
503 inline _LIBCPP_INLINE_VISIBILITY
504 _LIBCPP_CONSTEXPR
505 complex<double>::complex(const complex<float>& __c)
506     : __re_(__c.real()), __im_(__c.imag()) {}
508 inline _LIBCPP_INLINE_VISIBILITY
509 _LIBCPP_CONSTEXPR
510 complex<double>::complex(const complex<long double>& __c)
511     : __re_(__c.real()), __im_(__c.imag()) {}
513 inline _LIBCPP_INLINE_VISIBILITY
514 _LIBCPP_CONSTEXPR
515 complex<long double>::complex(const complex<float>& __c)
516     : __re_(__c.real()), __im_(__c.imag()) {}
518 inline _LIBCPP_INLINE_VISIBILITY
519 _LIBCPP_CONSTEXPR
520 complex<long double>::complex(const complex<double>& __c)
521     : __re_(__c.real()), __im_(__c.imag()) {}
523 // 26.3.6 operators:
525 template<class _Tp>
526 inline _LIBCPP_INLINE_VISIBILITY
527 complex<_Tp>
528 operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
530     complex<_Tp> __t(__x);
531     __t += __y;
532     return __t;
535 template<class _Tp>
536 inline _LIBCPP_INLINE_VISIBILITY
537 complex<_Tp>
538 operator+(const complex<_Tp>& __x, const _Tp& __y)
540     complex<_Tp> __t(__x);
541     __t += __y;
542     return __t;
545 template<class _Tp>
546 inline _LIBCPP_INLINE_VISIBILITY
547 complex<_Tp>
548 operator+(const _Tp& __x, const complex<_Tp>& __y)
550     complex<_Tp> __t(__y);
551     __t += __x;
552     return __t;
555 template<class _Tp>
556 inline _LIBCPP_INLINE_VISIBILITY
557 complex<_Tp>
558 operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
560     complex<_Tp> __t(__x);
561     __t -= __y;
562     return __t;
565 template<class _Tp>
566 inline _LIBCPP_INLINE_VISIBILITY
567 complex<_Tp>
568 operator-(const complex<_Tp>& __x, const _Tp& __y)
570     complex<_Tp> __t(__x);
571     __t -= __y;
572     return __t;
575 template<class _Tp>
576 inline _LIBCPP_INLINE_VISIBILITY
577 complex<_Tp>
578 operator-(const _Tp& __x, const complex<_Tp>& __y)
580     complex<_Tp> __t(-__y);
581     __t += __x;
582     return __t;
585 template<class _Tp>
586 complex<_Tp>
587 operator*(const complex<_Tp>& __z, const complex<_Tp>& __w)
589     _Tp __a = __z.real();
590     _Tp __b = __z.imag();
591     _Tp __c = __w.real();
592     _Tp __d = __w.imag();
593     _Tp __ac = __a * __c;
594     _Tp __bd = __b * __d;
595     _Tp __ad = __a * __d;
596     _Tp __bc = __b * __c;
597     _Tp __x = __ac - __bd;
598     _Tp __y = __ad + __bc;
599     if (isnan(__x) && isnan(__y))
600     {
601         bool __recalc = false;
602         if (isinf(__a) || isinf(__b))
603         {
604             __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
605             __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
606             if (isnan(__c))
607                 __c = copysign(_Tp(0), __c);
608             if (isnan(__d))
609                 __d = copysign(_Tp(0), __d);
610             __recalc = true;
611         }
612         if (isinf(__c) || isinf(__d))
613         {
614             __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
615             __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
616             if (isnan(__a))
617                 __a = copysign(_Tp(0), __a);
618             if (isnan(__b))
619                 __b = copysign(_Tp(0), __b);
620             __recalc = true;
621         }
622         if (!__recalc && (isinf(__ac) || isinf(__bd) ||
623                           isinf(__ad) || isinf(__bc)))
624         {
625             if (isnan(__a))
626                 __a = copysign(_Tp(0), __a);
627             if (isnan(__b))
628                 __b = copysign(_Tp(0), __b);
629             if (isnan(__c))
630                 __c = copysign(_Tp(0), __c);
631             if (isnan(__d))
632                 __d = copysign(_Tp(0), __d);
633             __recalc = true;
634         }
635         if (__recalc)
636         {
637             __x = _Tp(INFINITY) * (__a * __c - __b * __d);
638             __y = _Tp(INFINITY) * (__a * __d + __b * __c);
639         }
640     }
641     return complex<_Tp>(__x, __y);
644 template<class _Tp>
645 inline _LIBCPP_INLINE_VISIBILITY
646 complex<_Tp>
647 operator*(const complex<_Tp>& __x, const _Tp& __y)
649     complex<_Tp> __t(__x);
650     __t *= __y;
651     return __t;
654 template<class _Tp>
655 inline _LIBCPP_INLINE_VISIBILITY
656 complex<_Tp>
657 operator*(const _Tp& __x, const complex<_Tp>& __y)
659     complex<_Tp> __t(__y);
660     __t *= __x;
661     return __t;
664 template<class _Tp>
665 complex<_Tp>
666 operator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
668     int __ilogbw = 0;
669     _Tp __a = __z.real();
670     _Tp __b = __z.imag();
671     _Tp __c = __w.real();
672     _Tp __d = __w.imag();
673     _Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
674     if (isfinite(__logbw))
675     {
676         __ilogbw = static_cast<int>(__logbw);
677         __c = scalbn(__c, -__ilogbw);
678         __d = scalbn(__d, -__ilogbw);
679     }
680     _Tp __denom = __c * __c + __d * __d;
681     _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
682     _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
683     if (isnan(__x) && isnan(__y))
684     {
685         if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b)))
686         {
687             __x = copysign(_Tp(INFINITY), __c) * __a;
688             __y = copysign(_Tp(INFINITY), __c) * __b;
689         }
690         else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d))
691         {
692             __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
693             __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
694             __x = _Tp(INFINITY) * (__a * __c + __b * __d);
695             __y = _Tp(INFINITY) * (__b * __c - __a * __d);
696         }
697         else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && isfinite(__b))
698         {
699             __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
700             __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
701             __x = _Tp(0) * (__a * __c + __b * __d);
702             __y = _Tp(0) * (__b * __c - __a * __d);
703         }
704     }
705     return complex<_Tp>(__x, __y);
708 template<class _Tp>
709 inline _LIBCPP_INLINE_VISIBILITY
710 complex<_Tp>
711 operator/(const complex<_Tp>& __x, const _Tp& __y)
713     return complex<_Tp>(__x.real() / __y, __x.imag() / __y);
716 template<class _Tp>
717 inline _LIBCPP_INLINE_VISIBILITY
718 complex<_Tp>
719 operator/(const _Tp& __x, const complex<_Tp>& __y)
721     complex<_Tp> __t(__x);
722     __t /= __y;
723     return __t;
726 template<class _Tp>
727 inline _LIBCPP_INLINE_VISIBILITY
728 complex<_Tp>
729 operator+(const complex<_Tp>& __x)
731     return __x;
734 template<class _Tp>
735 inline _LIBCPP_INLINE_VISIBILITY
736 complex<_Tp>
737 operator-(const complex<_Tp>& __x)
739     return complex<_Tp>(-__x.real(), -__x.imag());
742 template<class _Tp>
743 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
744 bool
745 operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
747     return __x.real() == __y.real() && __x.imag() == __y.imag();
750 template<class _Tp>
751 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
752 bool
753 operator==(const complex<_Tp>& __x, const _Tp& __y)
755     return __x.real() == __y && __x.imag() == 0;
758 template<class _Tp>
759 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
760 bool
761 operator==(const _Tp& __x, const complex<_Tp>& __y)
763     return __x == __y.real() && 0 == __y.imag();
766 template<class _Tp>
767 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
768 bool
769 operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
771     return !(__x == __y);
774 template<class _Tp>
775 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
776 bool
777 operator!=(const complex<_Tp>& __x, const _Tp& __y)
779     return !(__x == __y);
782 template<class _Tp>
783 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
784 bool
785 operator!=(const _Tp& __x, const complex<_Tp>& __y)
787     return !(__x == __y);
790 // 26.3.7 values:
792 // real
794 template<class _Tp>
795 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
797 real(const complex<_Tp>& __c)
799     return __c.real();
802 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
803 long double
804 real(long double __re)
806     return __re;
809 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
810 double
811 real(double __re)
813     return __re;
816 template<class _Tp>
817 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
818 typename enable_if
820     is_integral<_Tp>::value,
821     double
822 >::type
823 real(_Tp  __re)
825     return __re;
828 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
829 float
830 real(float  __re)
832     return __re;
835 // imag
837 template<class _Tp>
838 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
840 imag(const complex<_Tp>& __c)
842     return __c.imag();
845 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
846 long double
847 imag(long double __re)
849     return 0;
852 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
853 double
854 imag(double __re)
856     return 0;
859 template<class _Tp>
860 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
861 typename enable_if
863     is_integral<_Tp>::value,
864     double
865 >::type
866 imag(_Tp  __re)
868     return 0;
871 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
872 float
873 imag(float  __re)
875     return 0;
878 // abs
880 template<class _Tp>
881 inline _LIBCPP_INLINE_VISIBILITY
883 abs(const complex<_Tp>& __c)
885     return hypot(__c.real(), __c.imag());
888 // arg
890 template<class _Tp>
891 inline _LIBCPP_INLINE_VISIBILITY
893 arg(const complex<_Tp>& __c)
895     return atan2(__c.imag(), __c.real());
898 inline _LIBCPP_INLINE_VISIBILITY
899 long double
900 arg(long double __re)
902     return atan2l(0.L, __re);
905 inline _LIBCPP_INLINE_VISIBILITY
906 double
907 arg(double __re)
909     return atan2(0., __re);
912 template<class _Tp>
913 inline _LIBCPP_INLINE_VISIBILITY
914 typename enable_if
916     is_integral<_Tp>::value,
917     double
918 >::type
919 arg(_Tp __re)
921     return atan2(0., __re);
924 inline _LIBCPP_INLINE_VISIBILITY
925 float
926 arg(float __re)
928     return atan2f(0.F, __re);
931 // norm
933 template<class _Tp>
934 inline _LIBCPP_INLINE_VISIBILITY
936 norm(const complex<_Tp>& __c)
938     if (isinf(__c.real()))
939         return abs(__c.real());
940     if (isinf(__c.imag()))
941         return abs(__c.imag());
942     return __c.real() * __c.real() + __c.imag() * __c.imag();
945 inline _LIBCPP_INLINE_VISIBILITY
946 long double
947 norm(long double __re)
949     return __re * __re;
952 inline _LIBCPP_INLINE_VISIBILITY
953 double
954 norm(double __re)
956     return __re * __re;
959 template<class _Tp>
960 inline _LIBCPP_INLINE_VISIBILITY
961 typename enable_if
963     is_integral<_Tp>::value,
964     double
965 >::type
966 norm(_Tp __re)
968     return (double)__re * __re;
971 inline _LIBCPP_INLINE_VISIBILITY
972 float
973 norm(float __re)
975     return __re * __re;
978 // conj
980 template<class _Tp>
981 inline _LIBCPP_INLINE_VISIBILITY
982 complex<_Tp>
983 conj(const complex<_Tp>& __c)
985     return complex<_Tp>(__c.real(), -__c.imag());
988 inline _LIBCPP_INLINE_VISIBILITY
989 complex<long double>
990 conj(long double __re)
992     return complex<long double>(__re);
995 inline _LIBCPP_INLINE_VISIBILITY
996 complex<double>
997 conj(double __re)
999     return complex<double>(__re);
1002 template<class _Tp>
1003 inline _LIBCPP_INLINE_VISIBILITY
1004 typename enable_if
1006     is_integral<_Tp>::value,
1007     complex<double>
1008 >::type
1009 conj(_Tp __re)
1011     return complex<double>(__re);
1014 inline _LIBCPP_INLINE_VISIBILITY
1015 complex<float>
1016 conj(float __re)
1018     return complex<float>(__re);
1021 // proj
1023 template<class _Tp>
1024 inline _LIBCPP_INLINE_VISIBILITY
1025 complex<_Tp>
1026 proj(const complex<_Tp>& __c)
1028     std::complex<_Tp> __r = __c;
1029     if (isinf(__c.real()) || isinf(__c.imag()))
1030         __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag()));
1031     return __r;
1034 inline _LIBCPP_INLINE_VISIBILITY
1035 complex<long double>
1036 proj(long double __re)
1038     if (isinf(__re))
1039         __re = abs(__re);
1040     return complex<long double>(__re);
1043 inline _LIBCPP_INLINE_VISIBILITY
1044 complex<double>
1045 proj(double __re)
1047     if (isinf(__re))
1048         __re = abs(__re);
1049     return complex<double>(__re);
1052 template<class _Tp>
1053 inline _LIBCPP_INLINE_VISIBILITY
1054 typename enable_if
1056     is_integral<_Tp>::value,
1057     complex<double>
1058 >::type
1059 proj(_Tp __re)
1061     return complex<double>(__re);
1064 inline _LIBCPP_INLINE_VISIBILITY
1065 complex<float>
1066 proj(float __re)
1068     if (isinf(__re))
1069         __re = abs(__re);
1070     return complex<float>(__re);
1073 // polar
1075 template<class _Tp>
1076 complex<_Tp>
1077 polar(const _Tp& __rho, const _Tp& __theta = _Tp(0))
1079     if (isnan(__rho) || signbit(__rho))
1080         return complex<_Tp>(_Tp(NAN), _Tp(NAN));
1081     if (isnan(__theta))
1082     {
1083         if (isinf(__rho))
1084             return complex<_Tp>(__rho, __theta);
1085         return complex<_Tp>(__theta, __theta);
1086     }
1087     if (isinf(__theta))
1088     {
1089         if (isinf(__rho))
1090             return complex<_Tp>(__rho, _Tp(NAN));
1091         return complex<_Tp>(_Tp(NAN), _Tp(NAN));
1092     }
1093     _Tp __x = __rho * cos(__theta);
1094     if (isnan(__x))
1095         __x = 0;
1096     _Tp __y = __rho * sin(__theta);
1097     if (isnan(__y))
1098         __y = 0;
1099     return complex<_Tp>(__x, __y);
1102 // log
1104 template<class _Tp>
1105 inline _LIBCPP_INLINE_VISIBILITY
1106 complex<_Tp>
1107 log(const complex<_Tp>& __x)
1109     return complex<_Tp>(log(abs(__x)), arg(__x));
1112 // log10
1114 template<class _Tp>
1115 inline _LIBCPP_INLINE_VISIBILITY
1116 complex<_Tp>
1117 log10(const complex<_Tp>& __x)
1119     return log(__x) / log(_Tp(10));
1122 // sqrt
1124 template<class _Tp>
1125 complex<_Tp>
1126 sqrt(const complex<_Tp>& __x)
1128     if (isinf(__x.imag()))
1129         return complex<_Tp>(_Tp(INFINITY), __x.imag());
1130     if (isinf(__x.real()))
1131     {
1132         if (__x.real() > _Tp(0))
1133             return complex<_Tp>(__x.real(), isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
1134         return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
1135     }
1136     return polar(sqrt(abs(__x)), arg(__x) / _Tp(2));
1139 // exp
1141 template<class _Tp>
1142 complex<_Tp>
1143 exp(const complex<_Tp>& __x)
1145     _Tp __i = __x.imag();
1146     if (isinf(__x.real()))
1147     {
1148         if (__x.real() < _Tp(0))
1149         {
1150             if (!isfinite(__i))
1151                 __i = _Tp(1);
1152         }
1153         else if (__i == 0 || !isfinite(__i))
1154         {
1155             if (isinf(__i))
1156                 __i = _Tp(NAN);
1157             return complex<_Tp>(__x.real(), __i);
1158         }
1159     }
1160     else if (isnan(__x.real()) && __x.imag() == 0)
1161         return __x;
1162     _Tp __e = exp(__x.real());
1163     return complex<_Tp>(__e * cos(__i), __e * sin(__i));
1166 // pow
1168 template<class _Tp>
1169 inline _LIBCPP_INLINE_VISIBILITY
1170 complex<_Tp>
1171 pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
1173     return exp(__y * log(__x));
1176 template<class _Tp, class _Up>
1177 inline _LIBCPP_INLINE_VISIBILITY
1178 complex<typename __promote<_Tp, _Up>::type>
1179 pow(const complex<_Tp>& __x, const complex<_Up>& __y)
1181     typedef complex<typename __promote<_Tp, _Up>::type> result_type;
1182     return _VSTD::pow(result_type(__x), result_type(__y));
1185 template<class _Tp, class _Up>
1186 inline _LIBCPP_INLINE_VISIBILITY
1187 typename enable_if
1189     is_arithmetic<_Up>::value,
1190     complex<typename __promote<_Tp, _Up>::type>
1191 >::type
1192 pow(const complex<_Tp>& __x, const _Up& __y)
1194     typedef complex<typename __promote<_Tp, _Up>::type> result_type;
1195     return _VSTD::pow(result_type(__x), result_type(__y));
1198 template<class _Tp, class _Up>
1199 inline _LIBCPP_INLINE_VISIBILITY
1200 typename enable_if
1202     is_arithmetic<_Tp>::value,
1203     complex<typename __promote<_Tp, _Up>::type>
1204 >::type
1205 pow(const _Tp& __x, const complex<_Up>& __y)
1207     typedef complex<typename __promote<_Tp, _Up>::type> result_type;
1208     return _VSTD::pow(result_type(__x), result_type(__y));
1211 // asinh
1213 template<class _Tp>
1214 complex<_Tp>
1215 asinh(const complex<_Tp>& __x)
1217     const _Tp __pi(atan2(+0., -0.));
1218     if (isinf(__x.real()))
1219     {
1220         if (isnan(__x.imag()))
1221             return __x;
1222         if (isinf(__x.imag()))
1223             return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
1224         return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
1225     }
1226     if (isnan(__x.real()))
1227     {
1228         if (isinf(__x.imag()))
1229             return complex<_Tp>(__x.imag(), __x.real());
1230         if (__x.imag() == 0)
1231             return __x;
1232         return complex<_Tp>(__x.real(), __x.real());
1233     }
1234     if (isinf(__x.imag()))
1235         return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
1236     complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1)));
1237     return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
1240 // acosh
1242 template<class _Tp>
1243 complex<_Tp>
1244 acosh(const complex<_Tp>& __x)
1246     const _Tp __pi(atan2(+0., -0.));
1247     if (isinf(__x.real()))
1248     {
1249         if (isnan(__x.imag()))
1250             return complex<_Tp>(abs(__x.real()), __x.imag());
1251         if (isinf(__x.imag()))
1252         {
1253             if (__x.real() > 0)
1254                 return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
1255             else
1256                 return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag()));
1257         }
1258         if (__x.real() < 0)
1259             return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag()));
1260         return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
1261     }
1262     if (isnan(__x.real()))
1263     {
1264         if (isinf(__x.imag()))
1265             return complex<_Tp>(abs(__x.imag()), __x.real());
1266         return complex<_Tp>(__x.real(), __x.real());
1267     }
1268     if (isinf(__x.imag()))
1269         return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag()));
1270     complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
1271     return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag()));
1274 // atanh
1276 template<class _Tp>
1277 complex<_Tp>
1278 atanh(const complex<_Tp>& __x)
1280     const _Tp __pi(atan2(+0., -0.));
1281     if (isinf(__x.imag()))
1282     {
1283         return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
1284     }
1285     if (isnan(__x.imag()))
1286     {
1287         if (isinf(__x.real()) || __x.real() == 0)
1288             return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag());
1289         return complex<_Tp>(__x.imag(), __x.imag());
1290     }
1291     if (isnan(__x.real()))
1292     {
1293         return complex<_Tp>(__x.real(), __x.real());
1294     }
1295     if (isinf(__x.real()))
1296     {
1297         return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
1298     }
1299     if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0))
1300     {
1301         return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag()));
1302     }
1303     complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2);
1304     return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
1307 // sinh
1309 template<class _Tp>
1310 complex<_Tp>
1311 sinh(const complex<_Tp>& __x)
1313     if (isinf(__x.real()) && !isfinite(__x.imag()))
1314         return complex<_Tp>(__x.real(), _Tp(NAN));
1315     if (__x.real() == 0 && !isfinite(__x.imag()))
1316         return complex<_Tp>(__x.real(), _Tp(NAN));
1317     if (__x.imag() == 0 && !isfinite(__x.real()))
1318         return __x;
1319     return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag()));
1322 // cosh
1324 template<class _Tp>
1325 complex<_Tp>
1326 cosh(const complex<_Tp>& __x)
1328     if (isinf(__x.real()) && !isfinite(__x.imag()))
1329         return complex<_Tp>(abs(__x.real()), _Tp(NAN));
1330     if (__x.real() == 0 && !isfinite(__x.imag()))
1331         return complex<_Tp>(_Tp(NAN), __x.real());
1332     if (__x.real() == 0 && __x.imag() == 0)
1333         return complex<_Tp>(_Tp(1), __x.imag());
1334     if (__x.imag() == 0 && !isfinite(__x.real()))
1335         return complex<_Tp>(abs(__x.real()), __x.imag());
1336     return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag()));
1339 // tanh
1341 template<class _Tp>
1342 complex<_Tp>
1343 tanh(const complex<_Tp>& __x)
1345     if (isinf(__x.real()))
1346     {
1347         if (!isfinite(__x.imag()))
1348             return complex<_Tp>(_Tp(1), _Tp(0));
1349         return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag())));
1350     }
1351     if (isnan(__x.real()) && __x.imag() == 0)
1352         return __x;
1353     _Tp __2r(_Tp(2) * __x.real());
1354     _Tp __2i(_Tp(2) * __x.imag());
1355     _Tp __d(cosh(__2r) + cos(__2i));
1356     _Tp __2rsh(sinh(__2r));
1357     if (isinf(__2rsh) && isinf(__d))
1358         return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1),
1359                             __2i > _Tp(0) ? _Tp(0) : _Tp(-0.));
1360     return  complex<_Tp>(__2rsh/__d, sin(__2i)/__d);
1363 // asin
1365 template<class _Tp>
1366 complex<_Tp>
1367 asin(const complex<_Tp>& __x)
1369     complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real()));
1370     return complex<_Tp>(__z.imag(), -__z.real());
1373 // acos
1375 template<class _Tp>
1376 complex<_Tp>
1377 acos(const complex<_Tp>& __x)
1379     const _Tp __pi(atan2(+0., -0.));
1380     if (isinf(__x.real()))
1381     {
1382         if (isnan(__x.imag()))
1383             return complex<_Tp>(__x.imag(), __x.real());
1384         if (isinf(__x.imag()))
1385         {
1386             if (__x.real() < _Tp(0))
1387                 return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag());
1388             return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag());
1389         }
1390         if (__x.real() < _Tp(0))
1391             return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real());
1392         return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real());
1393     }
1394     if (isnan(__x.real()))
1395     {
1396         if (isinf(__x.imag()))
1397             return complex<_Tp>(__x.real(), -__x.imag());
1398         return complex<_Tp>(__x.real(), __x.real());
1399     }
1400     if (isinf(__x.imag()))
1401         return complex<_Tp>(__pi/_Tp(2), -__x.imag());
1402     if (__x.real() == 0)
1403         return complex<_Tp>(__pi/_Tp(2), -__x.imag());
1404     complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
1405     if (signbit(__x.imag()))
1406         return complex<_Tp>(abs(__z.imag()), abs(__z.real()));
1407     return complex<_Tp>(abs(__z.imag()), -abs(__z.real()));
1410 // atan
1412 template<class _Tp>
1413 complex<_Tp>
1414 atan(const complex<_Tp>& __x)
1416     complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real()));
1417     return complex<_Tp>(__z.imag(), -__z.real());
1420 // sin
1422 template<class _Tp>
1423 complex<_Tp>
1424 sin(const complex<_Tp>& __x)
1426     complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real()));
1427     return complex<_Tp>(__z.imag(), -__z.real());
1430 // cos
1432 template<class _Tp>
1433 inline _LIBCPP_INLINE_VISIBILITY
1434 complex<_Tp>
1435 cos(const complex<_Tp>& __x)
1437     return cosh(complex<_Tp>(-__x.imag(), __x.real()));
1440 // tan
1442 template<class _Tp>
1443 complex<_Tp>
1444 tan(const complex<_Tp>& __x)
1446     complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real()));
1447     return complex<_Tp>(__z.imag(), -__z.real());
1450 template<class _Tp, class _CharT, class _Traits>
1451 basic_istream<_CharT, _Traits>&
1452 operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
1454     if (__is.good())
1455     {
1456         ws(__is);
1457         if (__is.peek() == _CharT('('))
1458         {
1459             __is.get();
1460             _Tp __r;
1461             __is >> __r;
1462             if (!__is.fail())
1463             {
1464                 ws(__is);
1465                 _CharT __c = __is.peek();
1466                 if (__c == _CharT(','))
1467                 {
1468                     __is.get();
1469                     _Tp __i;
1470                     __is >> __i;
1471                     if (!__is.fail())
1472                     {
1473                         ws(__is);
1474                         __c = __is.peek();
1475                         if (__c == _CharT(')'))
1476                         {
1477                             __is.get();
1478                             __x = complex<_Tp>(__r, __i);
1479                         }
1480                         else
1481                             __is.setstate(ios_base::failbit);
1482                     }
1483                     else
1484                         __is.setstate(ios_base::failbit);
1485                 }
1486                 else if (__c == _CharT(')'))
1487                 {
1488                     __is.get();
1489                     __x = complex<_Tp>(__r, _Tp(0));
1490                 }
1491                 else
1492                     __is.setstate(ios_base::failbit);
1493             }
1494             else
1495                 __is.setstate(ios_base::failbit);
1496         }
1497         else
1498         {
1499             _Tp __r;
1500             __is >> __r;
1501             if (!__is.fail())
1502                 __x = complex<_Tp>(__r, _Tp(0));
1503             else
1504                 __is.setstate(ios_base::failbit);
1505         }
1506     }
1507     else
1508         __is.setstate(ios_base::failbit);
1509     return __is;
1512 template<class _Tp, class _CharT, class _Traits>
1513 basic_ostream<_CharT, _Traits>&
1514 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
1516     basic_ostringstream<_CharT, _Traits> __s;
1517     __s.flags(__os.flags());
1518     __s.imbue(__os.getloc());
1519     __s.precision(__os.precision());
1520     __s << '(' << __x.real() << ',' << __x.imag() << ')';
1521     return __os << __s.str();
1524 #if _LIBCPP_STD_VER > 11 
1525 // Literal suffix for complex number literals [complex.literals]
1526 inline namespace literals
1528   inline namespace complex_literals
1529   {
1530     constexpr complex<long double> operator""il(long double __im)
1531     {
1532         return { 0.0l, __im };
1533     }
1535     constexpr complex<long double> operator""il(unsigned long long __im)
1536     {
1537         return { 0.0l, static_cast<long double>(__im) };
1538     }
1541     constexpr complex<double> operator""i(long double __im)
1542     {
1543         return { 0.0, static_cast<double>(__im) };
1544     }
1546     constexpr complex<double> operator""i(unsigned long long __im)
1547     {
1548         return { 0.0, static_cast<double>(__im) };
1549     }
1552     constexpr complex<float> operator""if(long double __im)
1553     {
1554         return { 0.0f, static_cast<float>(__im) };
1555     }
1557     constexpr complex<float> operator""if(unsigned long long __im)
1558     {
1559         return { 0.0f, static_cast<float>(__im) };
1560     }
1561   }
1563 #endif
1565 _LIBCPP_END_NAMESPACE_STD
1567 #endif  // _LIBCPP_COMPLEX