blob: f56138fa2d16e4c57daf9c9ff6fee553b5afd179 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- complex ----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_COMPLEX
12#define _LIBCPP_COMPLEX
13
14/*
15 complex synopsis
16
17namespace std
18{
19
20template<class T>
21class complex
22{
23public:
24 typedef T value_type;
25
Marshall Clowa61e6f82013-07-31 21:02:34 +000026 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
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000029
Marshall Clowa61e6f82013-07-31 21:02:34 +000030 T real() const; // constexpr in C++14
31 T imag() const; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000032
33 void real(T);
34 void imag(T);
35
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&);
41
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>&);
48};
49
50template<>
51class complex<float>
Howard Hinnant324bb032010-08-22 00:02:43 +000052{
53public:
54 typedef float value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000055
Howard Hinnant324bb032010-08-22 00:02:43 +000056 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>&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000059
Howard Hinnant324bb032010-08-22 00:02:43 +000060 constexpr float real() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000061 void real(float);
Howard Hinnant324bb032010-08-22 00:02:43 +000062 constexpr float imag() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000063 void imag(float);
64
Howard Hinnant324bb032010-08-22 00:02:43 +000065 complex<float>& operator= (float);
66 complex<float>& operator+=(float);
67 complex<float>& operator-=(float);
68 complex<float>& operator*=(float);
69 complex<float>& operator/=(float);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000070
Howard Hinnant324bb032010-08-22 00:02:43 +000071 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>&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000077};
78
79template<>
80class complex<double>
Howard Hinnant324bb032010-08-22 00:02:43 +000081{
82public:
83 typedef double value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000084
Howard Hinnant324bb032010-08-22 00:02:43 +000085 constexpr complex(double re = 0.0, double im = 0.0);
86 constexpr complex(const complex<float>&);
87 explicit constexpr complex(const complex<long double>&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000088
Howard Hinnant324bb032010-08-22 00:02:43 +000089 constexpr double real() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000090 void real(double);
Howard Hinnant324bb032010-08-22 00:02:43 +000091 constexpr double imag() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000092 void imag(double);
93
Howard Hinnant324bb032010-08-22 00:02:43 +000094 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>&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000100
Howard Hinnant324bb032010-08-22 00:02:43 +0000101 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>&);
106};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000107
108template<>
109class complex<long double>
Howard Hinnant324bb032010-08-22 00:02:43 +0000110{
111public:
112 typedef long double value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000113
Howard Hinnant324bb032010-08-22 00:02:43 +0000114 constexpr complex(long double re = 0.0L, long double im = 0.0L);
115 constexpr complex(const complex<float>&);
116 constexpr complex(const complex<double>&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000117
Howard Hinnant324bb032010-08-22 00:02:43 +0000118 constexpr long double real() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000119 void real(long double);
Howard Hinnant324bb032010-08-22 00:02:43 +0000120 constexpr long double imag() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000121 void imag(long double);
122
Howard Hinnant324bb032010-08-22 00:02:43 +0000123 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);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000129
Howard Hinnant324bb032010-08-22 00:02:43 +0000130 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>&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000135};
136
137// 26.3.6 operators:
138template<class T> complex<T> operator+(const complex<T>&, const complex<T>&);
139template<class T> complex<T> operator+(const complex<T>&, const T&);
140template<class T> complex<T> operator+(const T&, const complex<T>&);
141template<class T> complex<T> operator-(const complex<T>&, const complex<T>&);
142template<class T> complex<T> operator-(const complex<T>&, const T&);
143template<class T> complex<T> operator-(const T&, const complex<T>&);
144template<class T> complex<T> operator*(const complex<T>&, const complex<T>&);
145template<class T> complex<T> operator*(const complex<T>&, const T&);
146template<class T> complex<T> operator*(const T&, const complex<T>&);
147template<class T> complex<T> operator/(const complex<T>&, const complex<T>&);
148template<class T> complex<T> operator/(const complex<T>&, const T&);
149template<class T> complex<T> operator/(const T&, const complex<T>&);
150template<class T> complex<T> operator+(const complex<T>&);
151template<class T> complex<T> operator-(const complex<T>&);
Marshall Clowa61e6f82013-07-31 21:02:34 +0000152template<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14
153template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14
154template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14
155template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14
156template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14
157template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000158
159template<class T, class charT, class traits>
160 basic_istream<charT, traits>&
161 operator>>(basic_istream<charT, traits>&, complex<T>&);
162template<class T, class charT, class traits>
163 basic_ostream<charT, traits>&
164 operator<<(basic_ostream<charT, traits>&, const complex<T>&);
165
166// 26.3.7 values:
167
Marshall Clowa61e6f82013-07-31 21:02:34 +0000168template<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
171template<Integral T> double real(T); // constexpr in C++14
172 float real(float); // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000173
Marshall Clowa61e6f82013-07-31 21:02:34 +0000174template<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
177template<Integral T> double imag(T); // constexpr in C++14
178 float imag(float); // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000179
180template<class T> T abs(const complex<T>&);
181
182template<class T> T arg(const complex<T>&);
183 long double arg(long double);
184 double arg(double);
185template<Integral T> double arg(T);
186 float arg(float);
187
188template<class T> T norm(const complex<T>&);
189 long double norm(long double);
190 double norm(double);
191template<Integral T> double norm(T);
192 float norm(float);
193
Howard Hinnant995676a2010-11-18 17:34:48 +0000194template<class T> complex<T> conj(const complex<T>&);
195 complex<long double> conj(long double);
196 complex<double> conj(double);
197template<Integral T> complex<double> conj(T);
198 complex<float> conj(float);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000199
Howard Hinnant995676a2010-11-18 17:34:48 +0000200template<class T> complex<T> proj(const complex<T>&);
201 complex<long double> proj(long double);
202 complex<double> proj(double);
203template<Integral T> complex<double> proj(T);
204 complex<float> proj(float);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000205
206template<class T> complex<T> polar(const T&, const T& = 0);
207
208// 26.3.8 transcendentals:
209template<class T> complex<T> acos(const complex<T>&);
210template<class T> complex<T> asin(const complex<T>&);
211template<class T> complex<T> atan(const complex<T>&);
212template<class T> complex<T> acosh(const complex<T>&);
213template<class T> complex<T> asinh(const complex<T>&);
214template<class T> complex<T> atanh(const complex<T>&);
215template<class T> complex<T> cos (const complex<T>&);
216template<class T> complex<T> cosh (const complex<T>&);
217template<class T> complex<T> exp (const complex<T>&);
218template<class T> complex<T> log (const complex<T>&);
219template<class T> complex<T> log10(const complex<T>&);
220
221template<class T> complex<T> pow(const complex<T>&, const T&);
222template<class T> complex<T> pow(const complex<T>&, const complex<T>&);
223template<class T> complex<T> pow(const T&, const complex<T>&);
224
225template<class T> complex<T> sin (const complex<T>&);
226template<class T> complex<T> sinh (const complex<T>&);
227template<class T> complex<T> sqrt (const complex<T>&);
228template<class T> complex<T> tan (const complex<T>&);
229template<class T> complex<T> tanh (const complex<T>&);
230
231template<class T, class charT, class traits>
232 basic_istream<charT, traits>&
233 operator>>(basic_istream<charT, traits>& is, complex<T>& x);
234
235template<class T, class charT, class traits>
236 basic_ostream<charT, traits>&
237 operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
238
239} // std
240
241*/
242
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
251
Howard Hinnant08e17472011-10-17 20:05:10 +0000252#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000253#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000254#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000255
256_LIBCPP_BEGIN_NAMESPACE_STD
257
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000258template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY complex;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000259
260template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w);
261template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y);
262
263template<class _Tp>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000264class _LIBCPP_TYPE_VIS_ONLY complex
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000265{
266public:
267 typedef _Tp value_type;
268private:
269 value_type __re_;
270 value_type __im_;
271public:
Marshall Clowa61e6f82013-07-31 21:02:34 +0000272 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000273 complex(const value_type& __re = value_type(), const value_type& __im = value_type())
274 : __re_(__re), __im_(__im) {}
Marshall Clowa61e6f82013-07-31 21:02:34 +0000275 template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276 complex(const complex<_Xp>& __c)
277 : __re_(__c.real()), __im_(__c.imag()) {}
278
Marshall Clowa61e6f82013-07-31 21:02:34 +0000279 _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_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000281
282 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
283 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
284
Howard Hinnantae8b16e2012-01-10 15:15:47 +0000285 _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re)
286 {__re_ = __re; __im_ = value_type(); return *this;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000287 _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;}
291
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 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000312 *this = *this * complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000313 return *this;
314 }
315 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
316 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000317 *this = *this / complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000318 return *this;
319 }
320};
321
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000322template<> class _LIBCPP_TYPE_VIS_ONLY complex<double>;
323template<> class _LIBCPP_TYPE_VIS_ONLY complex<long double>;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000324
325template<>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000326class _LIBCPP_TYPE_VIS_ONLY complex<float>
Howard Hinnant324bb032010-08-22 00:02:43 +0000327{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000328 float __re_;
329 float __im_;
Howard Hinnant324bb032010-08-22 00:02:43 +0000330public:
331 typedef float value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000332
Howard Hinnant410f2de2012-07-20 22:18:27 +0000333 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000334 : __re_(__re), __im_(__im) {}
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000335 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant410f2de2012-07-20 22:18:27 +0000336 explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000337 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant410f2de2012-07-20 22:18:27 +0000338 explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000339
Howard Hinnant410f2de2012-07-20 22:18:27 +0000340 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;}
341 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000342
343 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
344 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
345
Howard Hinnantae8b16e2012-01-10 15:15:47 +0000346 _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re)
347 {__re_ = __re; __im_ = value_type(); return *this;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000348 _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;}
349 _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;}
350 _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;}
351 _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;}
352
353 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
354 {
355 __re_ = __c.real();
356 __im_ = __c.imag();
357 return *this;
358 }
359 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
360 {
361 __re_ += __c.real();
362 __im_ += __c.imag();
363 return *this;
364 }
365 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
366 {
367 __re_ -= __c.real();
368 __im_ -= __c.imag();
369 return *this;
370 }
371 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
372 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000373 *this = *this * complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000374 return *this;
375 }
376 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
377 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000378 *this = *this / complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000379 return *this;
380 }
381};
382
383template<>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000384class _LIBCPP_TYPE_VIS_ONLY complex<double>
Howard Hinnant324bb032010-08-22 00:02:43 +0000385{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000386 double __re_;
387 double __im_;
Howard Hinnant324bb032010-08-22 00:02:43 +0000388public:
389 typedef double value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000390
Howard Hinnant410f2de2012-07-20 22:18:27 +0000391 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000392 : __re_(__re), __im_(__im) {}
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000393 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant410f2de2012-07-20 22:18:27 +0000394 _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000395 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant410f2de2012-07-20 22:18:27 +0000396 explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000397
Howard Hinnant410f2de2012-07-20 22:18:27 +0000398 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;}
399 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000400
401 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
402 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
403
Howard Hinnantae8b16e2012-01-10 15:15:47 +0000404 _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re)
405 {__re_ = __re; __im_ = value_type(); return *this;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000406 _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;}
407 _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;}
408 _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;}
409 _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;}
410
411 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
412 {
413 __re_ = __c.real();
414 __im_ = __c.imag();
415 return *this;
416 }
417 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
418 {
419 __re_ += __c.real();
420 __im_ += __c.imag();
421 return *this;
422 }
423 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
424 {
425 __re_ -= __c.real();
426 __im_ -= __c.imag();
427 return *this;
428 }
429 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
430 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000431 *this = *this * complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000432 return *this;
433 }
434 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
435 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000436 *this = *this / complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000437 return *this;
438 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000439};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000440
441template<>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000442class _LIBCPP_TYPE_VIS_ONLY complex<long double>
Howard Hinnant324bb032010-08-22 00:02:43 +0000443{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000444 long double __re_;
445 long double __im_;
Howard Hinnant324bb032010-08-22 00:02:43 +0000446public:
447 typedef long double value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000448
Howard Hinnant410f2de2012-07-20 22:18:27 +0000449 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000450 : __re_(__re), __im_(__im) {}
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000451 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant410f2de2012-07-20 22:18:27 +0000452 _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000453 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant410f2de2012-07-20 22:18:27 +0000454 _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000455
Howard Hinnant410f2de2012-07-20 22:18:27 +0000456 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;}
457 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000458
459 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
460 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
461
Howard Hinnantae8b16e2012-01-10 15:15:47 +0000462 _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re)
463 {__re_ = __re; __im_ = value_type(); return *this;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000464 _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;}
465 _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;}
466 _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;}
467 _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; 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 __re_ -= __c.real();
484 __im_ -= __c.imag();
485 return *this;
486 }
487 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
488 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000489 *this = *this * complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000490 return *this;
491 }
492 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
493 {
Marshall Clowa61e6f82013-07-31 21:02:34 +0000494 *this = *this / complex(__c.real(), __c.imag());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000495 return *this;
496 }
497};
498
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000499inline
Howard Hinnant410f2de2012-07-20 22:18:27 +0000500_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000501complex<float>::complex(const complex<double>& __c)
502 : __re_(__c.real()), __im_(__c.imag()) {}
503
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000504inline
Howard Hinnant410f2de2012-07-20 22:18:27 +0000505_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000506complex<float>::complex(const complex<long double>& __c)
507 : __re_(__c.real()), __im_(__c.imag()) {}
508
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000509inline
Howard Hinnant410f2de2012-07-20 22:18:27 +0000510_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000511complex<double>::complex(const complex<float>& __c)
512 : __re_(__c.real()), __im_(__c.imag()) {}
513
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000514inline
Howard Hinnant410f2de2012-07-20 22:18:27 +0000515_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000516complex<double>::complex(const complex<long double>& __c)
517 : __re_(__c.real()), __im_(__c.imag()) {}
518
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000519inline
Howard Hinnant410f2de2012-07-20 22:18:27 +0000520_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000521complex<long double>::complex(const complex<float>& __c)
522 : __re_(__c.real()), __im_(__c.imag()) {}
523
Evgeniy Stepanov9341a8a2016-04-22 01:04:55 +0000524inline
Howard Hinnant410f2de2012-07-20 22:18:27 +0000525_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000526complex<long double>::complex(const complex<double>& __c)
527 : __re_(__c.real()), __im_(__c.imag()) {}
528
529// 26.3.6 operators:
530
531template<class _Tp>
532inline _LIBCPP_INLINE_VISIBILITY
533complex<_Tp>
534operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
535{
536 complex<_Tp> __t(__x);
537 __t += __y;
538 return __t;
539}
540
541template<class _Tp>
542inline _LIBCPP_INLINE_VISIBILITY
543complex<_Tp>
544operator+(const complex<_Tp>& __x, const _Tp& __y)
545{
546 complex<_Tp> __t(__x);
547 __t += __y;
548 return __t;
549}
550
551template<class _Tp>
552inline _LIBCPP_INLINE_VISIBILITY
553complex<_Tp>
554operator+(const _Tp& __x, const complex<_Tp>& __y)
555{
556 complex<_Tp> __t(__y);
557 __t += __x;
558 return __t;
559}
560
561template<class _Tp>
562inline _LIBCPP_INLINE_VISIBILITY
563complex<_Tp>
564operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
565{
566 complex<_Tp> __t(__x);
567 __t -= __y;
568 return __t;
569}
570
571template<class _Tp>
572inline _LIBCPP_INLINE_VISIBILITY
573complex<_Tp>
574operator-(const complex<_Tp>& __x, const _Tp& __y)
575{
576 complex<_Tp> __t(__x);
577 __t -= __y;
578 return __t;
579}
580
581template<class _Tp>
582inline _LIBCPP_INLINE_VISIBILITY
583complex<_Tp>
584operator-(const _Tp& __x, const complex<_Tp>& __y)
585{
586 complex<_Tp> __t(-__y);
587 __t += __x;
588 return __t;
589}
590
591template<class _Tp>
592complex<_Tp>
593operator*(const complex<_Tp>& __z, const complex<_Tp>& __w)
594{
595 _Tp __a = __z.real();
596 _Tp __b = __z.imag();
597 _Tp __c = __w.real();
598 _Tp __d = __w.imag();
599 _Tp __ac = __a * __c;
600 _Tp __bd = __b * __d;
601 _Tp __ad = __a * __d;
602 _Tp __bc = __b * __c;
603 _Tp __x = __ac - __bd;
604 _Tp __y = __ad + __bc;
605 if (isnan(__x) && isnan(__y))
606 {
607 bool __recalc = false;
608 if (isinf(__a) || isinf(__b))
609 {
610 __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
611 __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
612 if (isnan(__c))
613 __c = copysign(_Tp(0), __c);
614 if (isnan(__d))
615 __d = copysign(_Tp(0), __d);
616 __recalc = true;
617 }
618 if (isinf(__c) || isinf(__d))
619 {
620 __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
621 __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
622 if (isnan(__a))
623 __a = copysign(_Tp(0), __a);
624 if (isnan(__b))
625 __b = copysign(_Tp(0), __b);
626 __recalc = true;
627 }
628 if (!__recalc && (isinf(__ac) || isinf(__bd) ||
629 isinf(__ad) || isinf(__bc)))
630 {
631 if (isnan(__a))
632 __a = copysign(_Tp(0), __a);
633 if (isnan(__b))
634 __b = copysign(_Tp(0), __b);
635 if (isnan(__c))
636 __c = copysign(_Tp(0), __c);
637 if (isnan(__d))
638 __d = copysign(_Tp(0), __d);
639 __recalc = true;
640 }
641 if (__recalc)
642 {
643 __x = _Tp(INFINITY) * (__a * __c - __b * __d);
644 __y = _Tp(INFINITY) * (__a * __d + __b * __c);
645 }
646 }
647 return complex<_Tp>(__x, __y);
648}
649
650template<class _Tp>
651inline _LIBCPP_INLINE_VISIBILITY
652complex<_Tp>
653operator*(const complex<_Tp>& __x, const _Tp& __y)
654{
655 complex<_Tp> __t(__x);
656 __t *= __y;
657 return __t;
658}
659
660template<class _Tp>
661inline _LIBCPP_INLINE_VISIBILITY
662complex<_Tp>
663operator*(const _Tp& __x, const complex<_Tp>& __y)
664{
665 complex<_Tp> __t(__y);
666 __t *= __x;
667 return __t;
668}
669
670template<class _Tp>
671complex<_Tp>
672operator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
673{
674 int __ilogbw = 0;
675 _Tp __a = __z.real();
676 _Tp __b = __z.imag();
677 _Tp __c = __w.real();
678 _Tp __d = __w.imag();
679 _Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
680 if (isfinite(__logbw))
681 {
682 __ilogbw = static_cast<int>(__logbw);
683 __c = scalbn(__c, -__ilogbw);
684 __d = scalbn(__d, -__ilogbw);
685 }
686 _Tp __denom = __c * __c + __d * __d;
687 _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
688 _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
689 if (isnan(__x) && isnan(__y))
690 {
691 if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b)))
692 {
693 __x = copysign(_Tp(INFINITY), __c) * __a;
694 __y = copysign(_Tp(INFINITY), __c) * __b;
695 }
696 else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d))
697 {
698 __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
699 __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
700 __x = _Tp(INFINITY) * (__a * __c + __b * __d);
701 __y = _Tp(INFINITY) * (__b * __c - __a * __d);
702 }
703 else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && isfinite(__b))
704 {
705 __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
706 __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
707 __x = _Tp(0) * (__a * __c + __b * __d);
708 __y = _Tp(0) * (__b * __c - __a * __d);
709 }
710 }
711 return complex<_Tp>(__x, __y);
712}
713
714template<class _Tp>
715inline _LIBCPP_INLINE_VISIBILITY
716complex<_Tp>
717operator/(const complex<_Tp>& __x, const _Tp& __y)
718{
719 return complex<_Tp>(__x.real() / __y, __x.imag() / __y);
720}
721
722template<class _Tp>
723inline _LIBCPP_INLINE_VISIBILITY
724complex<_Tp>
725operator/(const _Tp& __x, const complex<_Tp>& __y)
726{
727 complex<_Tp> __t(__x);
728 __t /= __y;
729 return __t;
730}
731
732template<class _Tp>
733inline _LIBCPP_INLINE_VISIBILITY
734complex<_Tp>
735operator+(const complex<_Tp>& __x)
736{
737 return __x;
738}
739
740template<class _Tp>
741inline _LIBCPP_INLINE_VISIBILITY
742complex<_Tp>
743operator-(const complex<_Tp>& __x)
744{
745 return complex<_Tp>(-__x.real(), -__x.imag());
746}
747
748template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000749inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000750bool
751operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
752{
753 return __x.real() == __y.real() && __x.imag() == __y.imag();
754}
755
756template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000757inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000758bool
759operator==(const complex<_Tp>& __x, const _Tp& __y)
760{
761 return __x.real() == __y && __x.imag() == 0;
762}
763
764template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000765inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000766bool
767operator==(const _Tp& __x, const complex<_Tp>& __y)
768{
769 return __x == __y.real() && 0 == __y.imag();
770}
771
772template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000773inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000774bool
775operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
776{
777 return !(__x == __y);
778}
779
780template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000781inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000782bool
783operator!=(const complex<_Tp>& __x, const _Tp& __y)
784{
785 return !(__x == __y);
786}
787
788template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000789inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000790bool
791operator!=(const _Tp& __x, const complex<_Tp>& __y)
792{
793 return !(__x == __y);
794}
795
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000796// 26.3.7 values:
797
798// real
799
800template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000801inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000802_Tp
803real(const complex<_Tp>& __c)
804{
805 return __c.real();
806}
807
Marshall Clowa61e6f82013-07-31 21:02:34 +0000808inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000809long double
810real(long double __re)
811{
812 return __re;
813}
814
Marshall Clowa61e6f82013-07-31 21:02:34 +0000815inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000816double
817real(double __re)
818{
819 return __re;
820}
821
822template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000823inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000824typename enable_if
825<
826 is_integral<_Tp>::value,
827 double
828>::type
829real(_Tp __re)
830{
831 return __re;
832}
833
Marshall Clowa61e6f82013-07-31 21:02:34 +0000834inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000835float
836real(float __re)
837{
838 return __re;
839}
840
841// imag
842
843template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000844inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000845_Tp
846imag(const complex<_Tp>& __c)
847{
848 return __c.imag();
849}
850
Marshall Clowa61e6f82013-07-31 21:02:34 +0000851inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000852long double
853imag(long double __re)
854{
855 return 0;
856}
857
Marshall Clowa61e6f82013-07-31 21:02:34 +0000858inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000859double
860imag(double __re)
861{
862 return 0;
863}
864
865template<class _Tp>
Marshall Clowa61e6f82013-07-31 21:02:34 +0000866inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000867typename enable_if
868<
869 is_integral<_Tp>::value,
870 double
871>::type
872imag(_Tp __re)
873{
874 return 0;
875}
876
Marshall Clowa61e6f82013-07-31 21:02:34 +0000877inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000878float
879imag(float __re)
880{
881 return 0;
882}
883
884// abs
885
886template<class _Tp>
887inline _LIBCPP_INLINE_VISIBILITY
888_Tp
889abs(const complex<_Tp>& __c)
890{
891 return hypot(__c.real(), __c.imag());
892}
893
894// arg
895
896template<class _Tp>
897inline _LIBCPP_INLINE_VISIBILITY
898_Tp
899arg(const complex<_Tp>& __c)
900{
901 return atan2(__c.imag(), __c.real());
902}
903
904inline _LIBCPP_INLINE_VISIBILITY
905long double
906arg(long double __re)
907{
908 return atan2l(0.L, __re);
909}
910
911inline _LIBCPP_INLINE_VISIBILITY
912double
913arg(double __re)
914{
915 return atan2(0., __re);
916}
917
918template<class _Tp>
919inline _LIBCPP_INLINE_VISIBILITY
920typename enable_if
921<
922 is_integral<_Tp>::value,
923 double
924>::type
925arg(_Tp __re)
926{
927 return atan2(0., __re);
928}
929
930inline _LIBCPP_INLINE_VISIBILITY
931float
932arg(float __re)
933{
934 return atan2f(0.F, __re);
935}
936
937// norm
938
939template<class _Tp>
940inline _LIBCPP_INLINE_VISIBILITY
941_Tp
942norm(const complex<_Tp>& __c)
943{
944 if (isinf(__c.real()))
945 return abs(__c.real());
946 if (isinf(__c.imag()))
947 return abs(__c.imag());
948 return __c.real() * __c.real() + __c.imag() * __c.imag();
949}
950
951inline _LIBCPP_INLINE_VISIBILITY
952long double
953norm(long double __re)
954{
955 return __re * __re;
956}
957
958inline _LIBCPP_INLINE_VISIBILITY
959double
960norm(double __re)
961{
962 return __re * __re;
963}
964
965template<class _Tp>
966inline _LIBCPP_INLINE_VISIBILITY
967typename enable_if
968<
969 is_integral<_Tp>::value,
970 double
971>::type
972norm(_Tp __re)
973{
974 return (double)__re * __re;
975}
976
977inline _LIBCPP_INLINE_VISIBILITY
978float
979norm(float __re)
980{
981 return __re * __re;
982}
983
984// conj
985
986template<class _Tp>
987inline _LIBCPP_INLINE_VISIBILITY
988complex<_Tp>
989conj(const complex<_Tp>& __c)
990{
991 return complex<_Tp>(__c.real(), -__c.imag());
992}
993
994inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant995676a2010-11-18 17:34:48 +0000995complex<long double>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000996conj(long double __re)
997{
Howard Hinnant995676a2010-11-18 17:34:48 +0000998 return complex<long double>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000999}
1000
1001inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant995676a2010-11-18 17:34:48 +00001002complex<double>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001003conj(double __re)
1004{
Howard Hinnant995676a2010-11-18 17:34:48 +00001005 return complex<double>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001006}
1007
1008template<class _Tp>
1009inline _LIBCPP_INLINE_VISIBILITY
1010typename enable_if
1011<
1012 is_integral<_Tp>::value,
Howard Hinnant995676a2010-11-18 17:34:48 +00001013 complex<double>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001014>::type
1015conj(_Tp __re)
1016{
Howard Hinnant995676a2010-11-18 17:34:48 +00001017 return complex<double>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001018}
1019
1020inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant995676a2010-11-18 17:34:48 +00001021complex<float>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001022conj(float __re)
1023{
Howard Hinnant995676a2010-11-18 17:34:48 +00001024 return complex<float>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001025}
1026
1027// proj
1028
1029template<class _Tp>
1030inline _LIBCPP_INLINE_VISIBILITY
1031complex<_Tp>
1032proj(const complex<_Tp>& __c)
1033{
1034 std::complex<_Tp> __r = __c;
1035 if (isinf(__c.real()) || isinf(__c.imag()))
1036 __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag()));
1037 return __r;
1038}
1039
1040inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant995676a2010-11-18 17:34:48 +00001041complex<long double>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001042proj(long double __re)
1043{
1044 if (isinf(__re))
1045 __re = abs(__re);
Howard Hinnant995676a2010-11-18 17:34:48 +00001046 return complex<long double>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001047}
1048
1049inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant995676a2010-11-18 17:34:48 +00001050complex<double>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001051proj(double __re)
1052{
1053 if (isinf(__re))
1054 __re = abs(__re);
Howard Hinnant995676a2010-11-18 17:34:48 +00001055 return complex<double>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001056}
1057
1058template<class _Tp>
1059inline _LIBCPP_INLINE_VISIBILITY
1060typename enable_if
1061<
1062 is_integral<_Tp>::value,
Howard Hinnant995676a2010-11-18 17:34:48 +00001063 complex<double>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001064>::type
1065proj(_Tp __re)
1066{
Howard Hinnant995676a2010-11-18 17:34:48 +00001067 return complex<double>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001068}
1069
1070inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant995676a2010-11-18 17:34:48 +00001071complex<float>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001072proj(float __re)
1073{
1074 if (isinf(__re))
1075 __re = abs(__re);
Howard Hinnant995676a2010-11-18 17:34:48 +00001076 return complex<float>(__re);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001077}
1078
1079// polar
1080
1081template<class _Tp>
1082complex<_Tp>
1083polar(const _Tp& __rho, const _Tp& __theta = _Tp(0))
1084{
1085 if (isnan(__rho) || signbit(__rho))
1086 return complex<_Tp>(_Tp(NAN), _Tp(NAN));
1087 if (isnan(__theta))
1088 {
1089 if (isinf(__rho))
1090 return complex<_Tp>(__rho, __theta);
1091 return complex<_Tp>(__theta, __theta);
1092 }
1093 if (isinf(__theta))
1094 {
1095 if (isinf(__rho))
1096 return complex<_Tp>(__rho, _Tp(NAN));
1097 return complex<_Tp>(_Tp(NAN), _Tp(NAN));
1098 }
1099 _Tp __x = __rho * cos(__theta);
1100 if (isnan(__x))
1101 __x = 0;
1102 _Tp __y = __rho * sin(__theta);
1103 if (isnan(__y))
1104 __y = 0;
1105 return complex<_Tp>(__x, __y);
1106}
1107
1108// log
1109
1110template<class _Tp>
1111inline _LIBCPP_INLINE_VISIBILITY
1112complex<_Tp>
1113log(const complex<_Tp>& __x)
1114{
1115 return complex<_Tp>(log(abs(__x)), arg(__x));
1116}
1117
1118// log10
1119
1120template<class _Tp>
1121inline _LIBCPP_INLINE_VISIBILITY
1122complex<_Tp>
1123log10(const complex<_Tp>& __x)
1124{
1125 return log(__x) / log(_Tp(10));
1126}
1127
1128// sqrt
1129
1130template<class _Tp>
1131complex<_Tp>
1132sqrt(const complex<_Tp>& __x)
1133{
1134 if (isinf(__x.imag()))
1135 return complex<_Tp>(_Tp(INFINITY), __x.imag());
1136 if (isinf(__x.real()))
1137 {
1138 if (__x.real() > _Tp(0))
1139 return complex<_Tp>(__x.real(), isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
1140 return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
1141 }
1142 return polar(sqrt(abs(__x)), arg(__x) / _Tp(2));
1143}
1144
1145// exp
1146
1147template<class _Tp>
1148complex<_Tp>
1149exp(const complex<_Tp>& __x)
1150{
1151 _Tp __i = __x.imag();
1152 if (isinf(__x.real()))
1153 {
1154 if (__x.real() < _Tp(0))
1155 {
1156 if (!isfinite(__i))
1157 __i = _Tp(1);
1158 }
1159 else if (__i == 0 || !isfinite(__i))
1160 {
1161 if (isinf(__i))
1162 __i = _Tp(NAN);
1163 return complex<_Tp>(__x.real(), __i);
1164 }
1165 }
1166 else if (isnan(__x.real()) && __x.imag() == 0)
1167 return __x;
1168 _Tp __e = exp(__x.real());
1169 return complex<_Tp>(__e * cos(__i), __e * sin(__i));
1170}
1171
1172// pow
1173
1174template<class _Tp>
1175inline _LIBCPP_INLINE_VISIBILITY
1176complex<_Tp>
1177pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
1178{
1179 return exp(__y * log(__x));
1180}
1181
1182template<class _Tp, class _Up>
1183inline _LIBCPP_INLINE_VISIBILITY
1184complex<typename __promote<_Tp, _Up>::type>
1185pow(const complex<_Tp>& __x, const complex<_Up>& __y)
1186{
1187 typedef complex<typename __promote<_Tp, _Up>::type> result_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001188 return _VSTD::pow(result_type(__x), result_type(__y));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001189}
1190
1191template<class _Tp, class _Up>
1192inline _LIBCPP_INLINE_VISIBILITY
1193typename enable_if
1194<
1195 is_arithmetic<_Up>::value,
1196 complex<typename __promote<_Tp, _Up>::type>
1197>::type
1198pow(const complex<_Tp>& __x, const _Up& __y)
1199{
1200 typedef complex<typename __promote<_Tp, _Up>::type> result_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001201 return _VSTD::pow(result_type(__x), result_type(__y));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001202}
1203
1204template<class _Tp, class _Up>
1205inline _LIBCPP_INLINE_VISIBILITY
1206typename enable_if
1207<
1208 is_arithmetic<_Tp>::value,
1209 complex<typename __promote<_Tp, _Up>::type>
1210>::type
1211pow(const _Tp& __x, const complex<_Up>& __y)
1212{
1213 typedef complex<typename __promote<_Tp, _Up>::type> result_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001214 return _VSTD::pow(result_type(__x), result_type(__y));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001215}
1216
1217// asinh
1218
1219template<class _Tp>
1220complex<_Tp>
1221asinh(const complex<_Tp>& __x)
1222{
1223 const _Tp __pi(atan2(+0., -0.));
1224 if (isinf(__x.real()))
1225 {
1226 if (isnan(__x.imag()))
1227 return __x;
1228 if (isinf(__x.imag()))
1229 return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
1230 return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
1231 }
1232 if (isnan(__x.real()))
1233 {
1234 if (isinf(__x.imag()))
1235 return complex<_Tp>(__x.imag(), __x.real());
1236 if (__x.imag() == 0)
1237 return __x;
1238 return complex<_Tp>(__x.real(), __x.real());
1239 }
1240 if (isinf(__x.imag()))
1241 return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
1242 complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1)));
1243 return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
1244}
1245
1246// acosh
1247
1248template<class _Tp>
1249complex<_Tp>
1250acosh(const complex<_Tp>& __x)
1251{
1252 const _Tp __pi(atan2(+0., -0.));
1253 if (isinf(__x.real()))
1254 {
1255 if (isnan(__x.imag()))
1256 return complex<_Tp>(abs(__x.real()), __x.imag());
1257 if (isinf(__x.imag()))
Howard Hinnant0919dba2012-11-06 21:55:44 +00001258 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001259 if (__x.real() > 0)
1260 return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
1261 else
1262 return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag()));
Howard Hinnant0919dba2012-11-06 21:55:44 +00001263 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001264 if (__x.real() < 0)
1265 return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag()));
1266 return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
1267 }
1268 if (isnan(__x.real()))
1269 {
1270 if (isinf(__x.imag()))
1271 return complex<_Tp>(abs(__x.imag()), __x.real());
1272 return complex<_Tp>(__x.real(), __x.real());
1273 }
1274 if (isinf(__x.imag()))
1275 return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag()));
1276 complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
1277 return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag()));
1278}
1279
1280// atanh
1281
1282template<class _Tp>
1283complex<_Tp>
1284atanh(const complex<_Tp>& __x)
1285{
1286 const _Tp __pi(atan2(+0., -0.));
1287 if (isinf(__x.imag()))
1288 {
1289 return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
1290 }
1291 if (isnan(__x.imag()))
1292 {
1293 if (isinf(__x.real()) || __x.real() == 0)
1294 return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag());
1295 return complex<_Tp>(__x.imag(), __x.imag());
1296 }
1297 if (isnan(__x.real()))
1298 {
1299 return complex<_Tp>(__x.real(), __x.real());
1300 }
1301 if (isinf(__x.real()))
1302 {
1303 return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
1304 }
1305 if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0))
1306 {
1307 return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag()));
1308 }
1309 complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2);
1310 return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
1311}
1312
1313// sinh
1314
1315template<class _Tp>
1316complex<_Tp>
1317sinh(const complex<_Tp>& __x)
1318{
1319 if (isinf(__x.real()) && !isfinite(__x.imag()))
1320 return complex<_Tp>(__x.real(), _Tp(NAN));
1321 if (__x.real() == 0 && !isfinite(__x.imag()))
1322 return complex<_Tp>(__x.real(), _Tp(NAN));
1323 if (__x.imag() == 0 && !isfinite(__x.real()))
1324 return __x;
1325 return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag()));
1326}
1327
1328// cosh
1329
1330template<class _Tp>
1331complex<_Tp>
1332cosh(const complex<_Tp>& __x)
1333{
1334 if (isinf(__x.real()) && !isfinite(__x.imag()))
1335 return complex<_Tp>(abs(__x.real()), _Tp(NAN));
1336 if (__x.real() == 0 && !isfinite(__x.imag()))
1337 return complex<_Tp>(_Tp(NAN), __x.real());
1338 if (__x.real() == 0 && __x.imag() == 0)
1339 return complex<_Tp>(_Tp(1), __x.imag());
1340 if (__x.imag() == 0 && !isfinite(__x.real()))
1341 return complex<_Tp>(abs(__x.real()), __x.imag());
1342 return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag()));
1343}
1344
1345// tanh
1346
1347template<class _Tp>
1348complex<_Tp>
1349tanh(const complex<_Tp>& __x)
1350{
1351 if (isinf(__x.real()))
1352 {
1353 if (!isfinite(__x.imag()))
1354 return complex<_Tp>(_Tp(1), _Tp(0));
1355 return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag())));
1356 }
1357 if (isnan(__x.real()) && __x.imag() == 0)
1358 return __x;
1359 _Tp __2r(_Tp(2) * __x.real());
1360 _Tp __2i(_Tp(2) * __x.imag());
1361 _Tp __d(cosh(__2r) + cos(__2i));
Howard Hinnant2d3f4ee2012-09-19 23:51:47 +00001362 _Tp __2rsh(sinh(__2r));
1363 if (isinf(__2rsh) && isinf(__d))
1364 return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1),
1365 __2i > _Tp(0) ? _Tp(0) : _Tp(-0.));
1366 return complex<_Tp>(__2rsh/__d, sin(__2i)/__d);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001367}
1368
1369// asin
1370
1371template<class _Tp>
1372complex<_Tp>
1373asin(const complex<_Tp>& __x)
1374{
1375 complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real()));
1376 return complex<_Tp>(__z.imag(), -__z.real());
1377}
1378
1379// acos
1380
1381template<class _Tp>
1382complex<_Tp>
1383acos(const complex<_Tp>& __x)
1384{
1385 const _Tp __pi(atan2(+0., -0.));
1386 if (isinf(__x.real()))
1387 {
1388 if (isnan(__x.imag()))
1389 return complex<_Tp>(__x.imag(), __x.real());
1390 if (isinf(__x.imag()))
1391 {
1392 if (__x.real() < _Tp(0))
1393 return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag());
1394 return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag());
1395 }
1396 if (__x.real() < _Tp(0))
1397 return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real());
1398 return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real());
1399 }
1400 if (isnan(__x.real()))
1401 {
1402 if (isinf(__x.imag()))
1403 return complex<_Tp>(__x.real(), -__x.imag());
1404 return complex<_Tp>(__x.real(), __x.real());
1405 }
1406 if (isinf(__x.imag()))
1407 return complex<_Tp>(__pi/_Tp(2), -__x.imag());
Marshall Clowa2778112016-04-04 16:08:54 +00001408 if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag())))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001409 return complex<_Tp>(__pi/_Tp(2), -__x.imag());
1410 complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
1411 if (signbit(__x.imag()))
1412 return complex<_Tp>(abs(__z.imag()), abs(__z.real()));
1413 return complex<_Tp>(abs(__z.imag()), -abs(__z.real()));
1414}
1415
1416// atan
1417
1418template<class _Tp>
1419complex<_Tp>
1420atan(const complex<_Tp>& __x)
1421{
1422 complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real()));
1423 return complex<_Tp>(__z.imag(), -__z.real());
1424}
1425
1426// sin
1427
1428template<class _Tp>
1429complex<_Tp>
1430sin(const complex<_Tp>& __x)
1431{
1432 complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real()));
1433 return complex<_Tp>(__z.imag(), -__z.real());
1434}
1435
1436// cos
1437
1438template<class _Tp>
1439inline _LIBCPP_INLINE_VISIBILITY
1440complex<_Tp>
1441cos(const complex<_Tp>& __x)
1442{
1443 return cosh(complex<_Tp>(-__x.imag(), __x.real()));
1444}
1445
1446// tan
1447
1448template<class _Tp>
1449complex<_Tp>
1450tan(const complex<_Tp>& __x)
1451{
1452 complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real()));
1453 return complex<_Tp>(__z.imag(), -__z.real());
1454}
1455
1456template<class _Tp, class _CharT, class _Traits>
1457basic_istream<_CharT, _Traits>&
1458operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
1459{
1460 if (__is.good())
1461 {
1462 ws(__is);
1463 if (__is.peek() == _CharT('('))
1464 {
1465 __is.get();
1466 _Tp __r;
1467 __is >> __r;
1468 if (!__is.fail())
1469 {
1470 ws(__is);
1471 _CharT __c = __is.peek();
1472 if (__c == _CharT(','))
1473 {
1474 __is.get();
1475 _Tp __i;
1476 __is >> __i;
1477 if (!__is.fail())
1478 {
1479 ws(__is);
1480 __c = __is.peek();
1481 if (__c == _CharT(')'))
1482 {
1483 __is.get();
1484 __x = complex<_Tp>(__r, __i);
1485 }
1486 else
1487 __is.setstate(ios_base::failbit);
1488 }
1489 else
1490 __is.setstate(ios_base::failbit);
1491 }
1492 else if (__c == _CharT(')'))
1493 {
1494 __is.get();
1495 __x = complex<_Tp>(__r, _Tp(0));
1496 }
1497 else
1498 __is.setstate(ios_base::failbit);
1499 }
1500 else
1501 __is.setstate(ios_base::failbit);
1502 }
1503 else
1504 {
1505 _Tp __r;
1506 __is >> __r;
1507 if (!__is.fail())
1508 __x = complex<_Tp>(__r, _Tp(0));
1509 else
1510 __is.setstate(ios_base::failbit);
1511 }
1512 }
1513 else
1514 __is.setstate(ios_base::failbit);
1515 return __is;
1516}
1517
1518template<class _Tp, class _CharT, class _Traits>
1519basic_ostream<_CharT, _Traits>&
1520operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
1521{
1522 basic_ostringstream<_CharT, _Traits> __s;
1523 __s.flags(__os.flags());
1524 __s.imbue(__os.getloc());
1525 __s.precision(__os.precision());
1526 __s << '(' << __x.real() << ',' << __x.imag() << ')';
1527 return __os << __s.str();
1528}
1529
Marshall Clow320c80f2013-10-05 21:19:49 +00001530#if _LIBCPP_STD_VER > 11
1531// Literal suffix for complex number literals [complex.literals]
1532inline namespace literals
1533{
1534 inline namespace complex_literals
1535 {
1536 constexpr complex<long double> operator""il(long double __im)
1537 {
1538 return { 0.0l, __im };
1539 }
1540
1541 constexpr complex<long double> operator""il(unsigned long long __im)
1542 {
1543 return { 0.0l, static_cast<long double>(__im) };
1544 }
1545
1546
1547 constexpr complex<double> operator""i(long double __im)
1548 {
1549 return { 0.0, static_cast<double>(__im) };
1550 }
1551
1552 constexpr complex<double> operator""i(unsigned long long __im)
1553 {
1554 return { 0.0, static_cast<double>(__im) };
1555 }
1556
1557
1558 constexpr complex<float> operator""if(long double __im)
1559 {
1560 return { 0.0f, static_cast<float>(__im) };
1561 }
1562
1563 constexpr complex<float> operator""if(unsigned long long __im)
1564 {
1565 return { 0.0f, static_cast<float>(__im) };
1566 }
1567 }
1568}
1569#endif
1570
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001571_LIBCPP_END_NAMESPACE_STD
1572
1573#endif // _LIBCPP_COMPLEX