1 // -*- C++ -*- 2 //===--------------------------- complex ----------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef _LIBCPP_COMPLEX 11 #define _LIBCPP_COMPLEX 12 13 /* 14 complex synopsis 15 16 namespace std 17 { 18 19 template<class T> 20 class complex 21 { 22 public: 23 typedef T value_type; 24 25 complex(const T& re = T(), const T& im = T()); // constexpr in C++14 26 complex(const complex&); // constexpr in C++14 27 template<class X> complex(const complex<X>&); // constexpr in C++14 28 29 T real() const; // constexpr in C++14 30 T imag() const; // constexpr in C++14 31 32 void real(T); 33 void imag(T); 34 35 complex<T>& operator= (const 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 41 complex& operator=(const complex&); 42 template<class X> complex<T>& operator= (const complex<X>&); 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 }; 48 49 template<> 50 class complex<float> 51 { 52 public: 53 typedef float value_type; 54 55 constexpr complex(float re = 0.0f, float im = 0.0f); 56 explicit constexpr complex(const complex<double>&); 57 explicit constexpr complex(const complex<long double>&); 58 59 constexpr float real() const; 60 void real(float); 61 constexpr float imag() const; 62 void imag(float); 63 64 complex<float>& operator= (float); 65 complex<float>& operator+=(float); 66 complex<float>& operator-=(float); 67 complex<float>& operator*=(float); 68 complex<float>& operator/=(float); 69 70 complex<float>& operator=(const complex<float>&); 71 template<class X> complex<float>& operator= (const complex<X>&); 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 }; 77 78 template<> 79 class complex<double> 80 { 81 public: 82 typedef double value_type; 83 84 constexpr complex(double re = 0.0, double im = 0.0); 85 constexpr complex(const complex<float>&); 86 explicit constexpr complex(const complex<long double>&); 87 88 constexpr double real() const; 89 void real(double); 90 constexpr double imag() const; 91 void imag(double); 92 93 complex<double>& operator= (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=(const complex<double>&); 99 100 template<class X> complex<double>& operator= (const complex<X>&); 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 }; 106 107 template<> 108 class complex<long double> 109 { 110 public: 111 typedef long double value_type; 112 113 constexpr complex(long double re = 0.0L, long double im = 0.0L); 114 constexpr complex(const complex<float>&); 115 constexpr complex(const complex<double>&); 116 117 constexpr long double real() const; 118 void real(long double); 119 constexpr long double imag() const; 120 void imag(long double); 121 122 complex<long double>& operator=(const complex<long double>&); 123 complex<long double>& operator= (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 129 template<class X> complex<long double>& operator= (const complex<X>&); 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 }; 135 136 // 26.3.6 operators: 137 template<class T> complex<T> operator+(const complex<T>&, const complex<T>&); 138 template<class T> complex<T> operator+(const complex<T>&, const T&); 139 template<class T> complex<T> operator+(const T&, const complex<T>&); 140 template<class T> complex<T> operator-(const complex<T>&, const complex<T>&); 141 template<class T> complex<T> operator-(const complex<T>&, const T&); 142 template<class T> complex<T> operator-(const T&, const complex<T>&); 143 template<class T> complex<T> operator*(const complex<T>&, const complex<T>&); 144 template<class T> complex<T> operator*(const complex<T>&, const T&); 145 template<class T> complex<T> operator*(const T&, const complex<T>&); 146 template<class T> complex<T> operator/(const complex<T>&, const complex<T>&); 147 template<class T> complex<T> operator/(const complex<T>&, const T&); 148 template<class T> complex<T> operator/(const T&, const complex<T>&); 149 template<class T> complex<T> operator+(const complex<T>&); 150 template<class T> complex<T> operator-(const complex<T>&); 151 template<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14 152 template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14 153 template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14 154 template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14 155 template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14 156 template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14 157 158 template<class T, class charT, class traits> 159 basic_istream<charT, traits>& 160 operator>>(basic_istream<charT, traits>&, complex<T>&); 161 template<class T, class charT, class traits> 162 basic_ostream<charT, traits>& 163 operator<<(basic_ostream<charT, traits>&, const complex<T>&); 164 165 // 26.3.7 values: 166 167 template<class T> T real(const complex<T>&); // constexpr in C++14 168 long double real(long double); // constexpr in C++14 169 double real(double); // constexpr in C++14 170 template<Integral T> double real(T); // constexpr in C++14 171 float real(float); // constexpr in C++14 172 173 template<class T> T imag(const complex<T>&); // constexpr in C++14 174 long double imag(long double); // constexpr in C++14 175 double imag(double); // constexpr in C++14 176 template<Integral T> double imag(T); // constexpr in C++14 177 float imag(float); // constexpr in C++14 178 179 template<class T> T abs(const complex<T>&); 180 181 template<class T> T arg(const complex<T>&); 182 long double arg(long double); 183 double arg(double); 184 template<Integral T> double arg(T); 185 float arg(float); 186 187 template<class T> T norm(const complex<T>&); 188 long double norm(long double); 189 double norm(double); 190 template<Integral T> double norm(T); 191 float norm(float); 192 193 template<class T> complex<T> conj(const complex<T>&); 194 complex<long double> conj(long double); 195 complex<double> conj(double); 196 template<Integral T> complex<double> conj(T); 197 complex<float> conj(float); 198 199 template<class T> complex<T> proj(const complex<T>&); 200 complex<long double> proj(long double); 201 complex<double> proj(double); 202 template<Integral T> complex<double> proj(T); 203 complex<float> proj(float); 204 205 template<class T> complex<T> polar(const T&, const T& = T()); 206 207 // 26.3.8 transcendentals: 208 template<class T> complex<T> acos(const complex<T>&); 209 template<class T> complex<T> asin(const complex<T>&); 210 template<class T> complex<T> atan(const complex<T>&); 211 template<class T> complex<T> acosh(const complex<T>&); 212 template<class T> complex<T> asinh(const complex<T>&); 213 template<class T> complex<T> atanh(const complex<T>&); 214 template<class T> complex<T> cos (const complex<T>&); 215 template<class T> complex<T> cosh (const complex<T>&); 216 template<class T> complex<T> exp (const complex<T>&); 217 template<class T> complex<T> log (const complex<T>&); 218 template<class T> complex<T> log10(const complex<T>&); 219 220 template<class T> complex<T> pow(const complex<T>&, const T&); 221 template<class T> complex<T> pow(const complex<T>&, const complex<T>&); 222 template<class T> complex<T> pow(const T&, const complex<T>&); 223 224 template<class T> complex<T> sin (const complex<T>&); 225 template<class T> complex<T> sinh (const complex<T>&); 226 template<class T> complex<T> sqrt (const complex<T>&); 227 template<class T> complex<T> tan (const complex<T>&); 228 template<class T> complex<T> tanh (const complex<T>&); 229 230 } // std 231 232 */ 233 234 #include <__config> 235 #include <type_traits> 236 #include <stdexcept> 237 #include <cmath> 238 #include <iosfwd> 239 #include <version> 240 241 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION) 242 # include <sstream> // for std::basic_ostringstream 243 #endif 244 245 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 246 #pragma GCC system_header 247 #endif 248 249 _LIBCPP_BEGIN_NAMESPACE_STD 250 251 template<class _Tp> class _LIBCPP_TEMPLATE_VIS complex; 252 253 template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w); 254 template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y); 255 256 template<class _Tp> 257 class _LIBCPP_TEMPLATE_VIS complex 258 { 259 public: 260 typedef _Tp value_type; 261 private: 262 value_type __re_; 263 value_type __im_; 264 public: 265 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 266 complex(const value_type& __re = value_type(), const value_type& __im = value_type()) 267 : __re_(__re), __im_(__im) {} 268 template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 269 complex(const complex<_Xp>& __c) 270 : __re_(__c.real()), __im_(__c.imag()) {} 271 272 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;} 273 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;} 274 275 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 276 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 277 278 _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) 279 {__re_ = __re; __im_ = value_type(); return *this;} 280 _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;} 281 _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;} 282 _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;} 283 _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;} 284 285 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 286 { 287 __re_ = __c.real(); 288 __im_ = __c.imag(); 289 return *this; 290 } 291 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 292 { 293 __re_ += __c.real(); 294 __im_ += __c.imag(); 295 return *this; 296 } 297 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 298 { 299 __re_ -= __c.real(); 300 __im_ -= __c.imag(); 301 return *this; 302 } 303 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 304 { 305 *this = *this * complex(__c.real(), __c.imag()); 306 return *this; 307 } 308 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 309 { 310 *this = *this / complex(__c.real(), __c.imag()); 311 return *this; 312 } 313 }; 314 315 template<> class _LIBCPP_TEMPLATE_VIS complex<double>; 316 template<> class _LIBCPP_TEMPLATE_VIS complex<long double>; 317 318 template<> 319 class _LIBCPP_TEMPLATE_VIS complex<float> 320 { 321 float __re_; 322 float __im_; 323 public: 324 typedef float value_type; 325 326 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f) 327 : __re_(__re), __im_(__im) {} 328 _LIBCPP_INLINE_VISIBILITY 329 explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 330 _LIBCPP_INLINE_VISIBILITY 331 explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 332 333 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;} 334 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;} 335 336 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 337 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 338 339 _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) 340 {__re_ = __re; __im_ = value_type(); return *this;} 341 _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;} 342 _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;} 343 _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;} 344 _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;} 345 346 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 347 { 348 __re_ = __c.real(); 349 __im_ = __c.imag(); 350 return *this; 351 } 352 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 353 { 354 __re_ += __c.real(); 355 __im_ += __c.imag(); 356 return *this; 357 } 358 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 359 { 360 __re_ -= __c.real(); 361 __im_ -= __c.imag(); 362 return *this; 363 } 364 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 365 { 366 *this = *this * complex(__c.real(), __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 }; 375 376 template<> 377 class _LIBCPP_TEMPLATE_VIS complex<double> 378 { 379 double __re_; 380 double __im_; 381 public: 382 typedef double value_type; 383 384 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0) 385 : __re_(__re), __im_(__im) {} 386 _LIBCPP_INLINE_VISIBILITY 387 _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 388 _LIBCPP_INLINE_VISIBILITY 389 explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 390 391 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;} 392 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;} 393 394 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 395 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 396 397 _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) 398 {__re_ = __re; __im_ = value_type(); return *this;} 399 _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;} 400 _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;} 401 _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;} 402 _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;} 403 404 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 405 { 406 __re_ = __c.real(); 407 __im_ = __c.imag(); 408 return *this; 409 } 410 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 411 { 412 __re_ += __c.real(); 413 __im_ += __c.imag(); 414 return *this; 415 } 416 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 417 { 418 __re_ -= __c.real(); 419 __im_ -= __c.imag(); 420 return *this; 421 } 422 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 423 { 424 *this = *this * complex(__c.real(), __c.imag()); 425 return *this; 426 } 427 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 428 { 429 *this = *this / complex(__c.real(), __c.imag()); 430 return *this; 431 } 432 }; 433 434 template<> 435 class _LIBCPP_TEMPLATE_VIS complex<long double> 436 { 437 long double __re_; 438 long double __im_; 439 public: 440 typedef long double value_type; 441 442 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L) 443 : __re_(__re), __im_(__im) {} 444 _LIBCPP_INLINE_VISIBILITY 445 _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 446 _LIBCPP_INLINE_VISIBILITY 447 _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 448 449 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;} 450 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;} 451 452 _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 453 _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 454 455 _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) 456 {__re_ = __re; __im_ = value_type(); return *this;} 457 _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; 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; __im_ *= __re; return *this;} 460 _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;} 461 462 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 463 { 464 __re_ = __c.real(); 465 __im_ = __c.imag(); 466 return *this; 467 } 468 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 469 { 470 __re_ += __c.real(); 471 __im_ += __c.imag(); 472 return *this; 473 } 474 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 475 { 476 __re_ -= __c.real(); 477 __im_ -= __c.imag(); 478 return *this; 479 } 480 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 481 { 482 *this = *this * complex(__c.real(), __c.imag()); 483 return *this; 484 } 485 template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 486 { 487 *this = *this / complex(__c.real(), __c.imag()); 488 return *this; 489 } 490 }; 491 492 inline 493 _LIBCPP_CONSTEXPR 494 complex<float>::complex(const complex<double>& __c) 495 : __re_(__c.real()), __im_(__c.imag()) {} 496 497 inline 498 _LIBCPP_CONSTEXPR 499 complex<float>::complex(const complex<long double>& __c) 500 : __re_(__c.real()), __im_(__c.imag()) {} 501 502 inline 503 _LIBCPP_CONSTEXPR 504 complex<double>::complex(const complex<float>& __c) 505 : __re_(__c.real()), __im_(__c.imag()) {} 506 507 inline 508 _LIBCPP_CONSTEXPR 509 complex<double>::complex(const complex<long double>& __c) 510 : __re_(__c.real()), __im_(__c.imag()) {} 511 512 inline 513 _LIBCPP_CONSTEXPR 514 complex<long double>::complex(const complex<float>& __c) 515 : __re_(__c.real()), __im_(__c.imag()) {} 516 517 inline 518 _LIBCPP_CONSTEXPR 519 complex<long double>::complex(const complex<double>& __c) 520 : __re_(__c.real()), __im_(__c.imag()) {} 521 522 // 26.3.6 operators: 523 524 template<class _Tp> 525 inline _LIBCPP_INLINE_VISIBILITY 526 complex<_Tp> 527 operator+(const complex<_Tp>& __x, const complex<_Tp>& __y) 528 { 529 complex<_Tp> __t(__x); 530 __t += __y; 531 return __t; 532 } 533 534 template<class _Tp> 535 inline _LIBCPP_INLINE_VISIBILITY 536 complex<_Tp> 537 operator+(const complex<_Tp>& __x, const _Tp& __y) 538 { 539 complex<_Tp> __t(__x); 540 __t += __y; 541 return __t; 542 } 543 544 template<class _Tp> 545 inline _LIBCPP_INLINE_VISIBILITY 546 complex<_Tp> 547 operator+(const _Tp& __x, const complex<_Tp>& __y) 548 { 549 complex<_Tp> __t(__y); 550 __t += __x; 551 return __t; 552 } 553 554 template<class _Tp> 555 inline _LIBCPP_INLINE_VISIBILITY 556 complex<_Tp> 557 operator-(const complex<_Tp>& __x, const complex<_Tp>& __y) 558 { 559 complex<_Tp> __t(__x); 560 __t -= __y; 561 return __t; 562 } 563 564 template<class _Tp> 565 inline _LIBCPP_INLINE_VISIBILITY 566 complex<_Tp> 567 operator-(const complex<_Tp>& __x, const _Tp& __y) 568 { 569 complex<_Tp> __t(__x); 570 __t -= __y; 571 return __t; 572 } 573 574 template<class _Tp> 575 inline _LIBCPP_INLINE_VISIBILITY 576 complex<_Tp> 577 operator-(const _Tp& __x, const complex<_Tp>& __y) 578 { 579 complex<_Tp> __t(-__y); 580 __t += __x; 581 return __t; 582 } 583 584 template<class _Tp> 585 complex<_Tp> 586 operator*(const complex<_Tp>& __z, const complex<_Tp>& __w) 587 { 588 _Tp __a = __z.real(); 589 _Tp __b = __z.imag(); 590 _Tp __c = __w.real(); 591 _Tp __d = __w.imag(); 592 _Tp __ac = __a * __c; 593 _Tp __bd = __b * __d; 594 _Tp __ad = __a * __d; 595 _Tp __bc = __b * __c; 596 _Tp __x = __ac - __bd; 597 _Tp __y = __ad + __bc; 598 if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 599 { 600 bool __recalc = false; 601 if (__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) 602 { 603 __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 604 __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 605 if (__libcpp_isnan_or_builtin(__c)) 606 __c = copysign(_Tp(0), __c); 607 if (__libcpp_isnan_or_builtin(__d)) 608 __d = copysign(_Tp(0), __d); 609 __recalc = true; 610 } 611 if (__libcpp_isinf_or_builtin(__c) || __libcpp_isinf_or_builtin(__d)) 612 { 613 __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 614 __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 615 if (__libcpp_isnan_or_builtin(__a)) 616 __a = copysign(_Tp(0), __a); 617 if (__libcpp_isnan_or_builtin(__b)) 618 __b = copysign(_Tp(0), __b); 619 __recalc = true; 620 } 621 if (!__recalc && (__libcpp_isinf_or_builtin(__ac) || __libcpp_isinf_or_builtin(__bd) || 622 __libcpp_isinf_or_builtin(__ad) || __libcpp_isinf_or_builtin(__bc))) 623 { 624 if (__libcpp_isnan_or_builtin(__a)) 625 __a = copysign(_Tp(0), __a); 626 if (__libcpp_isnan_or_builtin(__b)) 627 __b = copysign(_Tp(0), __b); 628 if (__libcpp_isnan_or_builtin(__c)) 629 __c = copysign(_Tp(0), __c); 630 if (__libcpp_isnan_or_builtin(__d)) 631 __d = copysign(_Tp(0), __d); 632 __recalc = true; 633 } 634 if (__recalc) 635 { 636 __x = _Tp(INFINITY) * (__a * __c - __b * __d); 637 __y = _Tp(INFINITY) * (__a * __d + __b * __c); 638 } 639 } 640 return complex<_Tp>(__x, __y); 641 } 642 643 template<class _Tp> 644 inline _LIBCPP_INLINE_VISIBILITY 645 complex<_Tp> 646 operator*(const complex<_Tp>& __x, const _Tp& __y) 647 { 648 complex<_Tp> __t(__x); 649 __t *= __y; 650 return __t; 651 } 652 653 template<class _Tp> 654 inline _LIBCPP_INLINE_VISIBILITY 655 complex<_Tp> 656 operator*(const _Tp& __x, const complex<_Tp>& __y) 657 { 658 complex<_Tp> __t(__y); 659 __t *= __x; 660 return __t; 661 } 662 663 template<class _Tp> 664 complex<_Tp> 665 operator/(const complex<_Tp>& __z, const complex<_Tp>& __w) 666 { 667 int __ilogbw = 0; 668 _Tp __a = __z.real(); 669 _Tp __b = __z.imag(); 670 _Tp __c = __w.real(); 671 _Tp __d = __w.imag(); 672 _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); 673 if (__libcpp_isfinite_or_builtin(__logbw)) 674 { 675 __ilogbw = static_cast<int>(__logbw); 676 __c = scalbn(__c, -__ilogbw); 677 __d = scalbn(__d, -__ilogbw); 678 } 679 _Tp __denom = __c * __c + __d * __d; 680 _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); 681 _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); 682 if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 683 { 684 if ((__denom == _Tp(0)) && (!__libcpp_isnan_or_builtin(__a) || !__libcpp_isnan_or_builtin(__b))) 685 { 686 __x = copysign(_Tp(INFINITY), __c) * __a; 687 __y = copysign(_Tp(INFINITY), __c) * __b; 688 } 689 else if ((__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) && __libcpp_isfinite_or_builtin(__c) && __libcpp_isfinite_or_builtin(__d)) 690 { 691 __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 692 __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 693 __x = _Tp(INFINITY) * (__a * __c + __b * __d); 694 __y = _Tp(INFINITY) * (__b * __c - __a * __d); 695 } 696 else if (__libcpp_isinf_or_builtin(__logbw) && __logbw > _Tp(0) && __libcpp_isfinite_or_builtin(__a) && __libcpp_isfinite_or_builtin(__b)) 697 { 698 __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 699 __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 700 __x = _Tp(0) * (__a * __c + __b * __d); 701 __y = _Tp(0) * (__b * __c - __a * __d); 702 } 703 } 704 return complex<_Tp>(__x, __y); 705 } 706 707 template<class _Tp> 708 inline _LIBCPP_INLINE_VISIBILITY 709 complex<_Tp> 710 operator/(const complex<_Tp>& __x, const _Tp& __y) 711 { 712 return complex<_Tp>(__x.real() / __y, __x.imag() / __y); 713 } 714 715 template<class _Tp> 716 inline _LIBCPP_INLINE_VISIBILITY 717 complex<_Tp> 718 operator/(const _Tp& __x, const complex<_Tp>& __y) 719 { 720 complex<_Tp> __t(__x); 721 __t /= __y; 722 return __t; 723 } 724 725 template<class _Tp> 726 inline _LIBCPP_INLINE_VISIBILITY 727 complex<_Tp> 728 operator+(const complex<_Tp>& __x) 729 { 730 return __x; 731 } 732 733 template<class _Tp> 734 inline _LIBCPP_INLINE_VISIBILITY 735 complex<_Tp> 736 operator-(const complex<_Tp>& __x) 737 { 738 return complex<_Tp>(-__x.real(), -__x.imag()); 739 } 740 741 template<class _Tp> 742 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 743 bool 744 operator==(const complex<_Tp>& __x, const complex<_Tp>& __y) 745 { 746 return __x.real() == __y.real() && __x.imag() == __y.imag(); 747 } 748 749 template<class _Tp> 750 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 751 bool 752 operator==(const complex<_Tp>& __x, const _Tp& __y) 753 { 754 return __x.real() == __y && __x.imag() == 0; 755 } 756 757 template<class _Tp> 758 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 759 bool 760 operator==(const _Tp& __x, const complex<_Tp>& __y) 761 { 762 return __x == __y.real() && 0 == __y.imag(); 763 } 764 765 template<class _Tp> 766 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 767 bool 768 operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) 769 { 770 return !(__x == __y); 771 } 772 773 template<class _Tp> 774 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 775 bool 776 operator!=(const complex<_Tp>& __x, const _Tp& __y) 777 { 778 return !(__x == __y); 779 } 780 781 template<class _Tp> 782 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 783 bool 784 operator!=(const _Tp& __x, const complex<_Tp>& __y) 785 { 786 return !(__x == __y); 787 } 788 789 // 26.3.7 values: 790 791 template <class _Tp, bool = is_integral<_Tp>::value, 792 bool = is_floating_point<_Tp>::value 793 > 794 struct __libcpp_complex_overload_traits {}; 795 796 // Integral Types 797 template <class _Tp> 798 struct __libcpp_complex_overload_traits<_Tp, true, false> 799 { 800 typedef double _ValueType; 801 typedef complex<double> _ComplexType; 802 }; 803 804 // Floating point types 805 template <class _Tp> 806 struct __libcpp_complex_overload_traits<_Tp, false, true> 807 { 808 typedef _Tp _ValueType; 809 typedef complex<_Tp> _ComplexType; 810 }; 811 812 // real 813 814 template<class _Tp> 815 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 816 _Tp 817 real(const complex<_Tp>& __c) 818 { 819 return __c.real(); 820 } 821 822 template <class _Tp> 823 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 824 typename __libcpp_complex_overload_traits<_Tp>::_ValueType 825 real(_Tp __re) 826 { 827 return __re; 828 } 829 830 // imag 831 832 template<class _Tp> 833 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 834 _Tp 835 imag(const complex<_Tp>& __c) 836 { 837 return __c.imag(); 838 } 839 840 template <class _Tp> 841 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 842 typename __libcpp_complex_overload_traits<_Tp>::_ValueType 843 imag(_Tp) 844 { 845 return 0; 846 } 847 848 // abs 849 850 template<class _Tp> 851 inline _LIBCPP_INLINE_VISIBILITY 852 _Tp 853 abs(const complex<_Tp>& __c) 854 { 855 return hypot(__c.real(), __c.imag()); 856 } 857 858 // arg 859 860 template<class _Tp> 861 inline _LIBCPP_INLINE_VISIBILITY 862 _Tp 863 arg(const complex<_Tp>& __c) 864 { 865 return atan2(__c.imag(), __c.real()); 866 } 867 868 template <class _Tp> 869 inline _LIBCPP_INLINE_VISIBILITY 870 typename enable_if< 871 is_same<_Tp, long double>::value, 872 long double 873 >::type 874 arg(_Tp __re) 875 { 876 return atan2l(0.L, __re); 877 } 878 879 template<class _Tp> 880 inline _LIBCPP_INLINE_VISIBILITY 881 typename enable_if 882 < 883 is_integral<_Tp>::value || is_same<_Tp, double>::value, 884 double 885 >::type 886 arg(_Tp __re) 887 { 888 return atan2(0., __re); 889 } 890 891 template <class _Tp> 892 inline _LIBCPP_INLINE_VISIBILITY 893 typename enable_if< 894 is_same<_Tp, float>::value, 895 float 896 >::type 897 arg(_Tp __re) 898 { 899 return atan2f(0.F, __re); 900 } 901 902 // norm 903 904 template<class _Tp> 905 inline _LIBCPP_INLINE_VISIBILITY 906 _Tp 907 norm(const complex<_Tp>& __c) 908 { 909 if (__libcpp_isinf_or_builtin(__c.real())) 910 return abs(__c.real()); 911 if (__libcpp_isinf_or_builtin(__c.imag())) 912 return abs(__c.imag()); 913 return __c.real() * __c.real() + __c.imag() * __c.imag(); 914 } 915 916 template <class _Tp> 917 inline _LIBCPP_INLINE_VISIBILITY 918 typename __libcpp_complex_overload_traits<_Tp>::_ValueType 919 norm(_Tp __re) 920 { 921 typedef typename __libcpp_complex_overload_traits<_Tp>::_ValueType _ValueType; 922 return static_cast<_ValueType>(__re) * __re; 923 } 924 925 // conj 926 927 template<class _Tp> 928 inline _LIBCPP_INLINE_VISIBILITY 929 complex<_Tp> 930 conj(const complex<_Tp>& __c) 931 { 932 return complex<_Tp>(__c.real(), -__c.imag()); 933 } 934 935 template <class _Tp> 936 inline _LIBCPP_INLINE_VISIBILITY 937 typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 938 conj(_Tp __re) 939 { 940 typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 941 return _ComplexType(__re); 942 } 943 944 945 946 // proj 947 948 template<class _Tp> 949 inline _LIBCPP_INLINE_VISIBILITY 950 complex<_Tp> 951 proj(const complex<_Tp>& __c) 952 { 953 complex<_Tp> __r = __c; 954 if (__libcpp_isinf_or_builtin(__c.real()) || __libcpp_isinf_or_builtin(__c.imag())) 955 __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag())); 956 return __r; 957 } 958 959 template <class _Tp> 960 inline _LIBCPP_INLINE_VISIBILITY 961 typename enable_if 962 < 963 is_floating_point<_Tp>::value, 964 typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 965 >::type 966 proj(_Tp __re) 967 { 968 if (__libcpp_isinf_or_builtin(__re)) 969 __re = abs(__re); 970 return complex<_Tp>(__re); 971 } 972 973 template <class _Tp> 974 inline _LIBCPP_INLINE_VISIBILITY 975 typename enable_if 976 < 977 is_integral<_Tp>::value, 978 typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 979 >::type 980 proj(_Tp __re) 981 { 982 typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 983 return _ComplexType(__re); 984 } 985 986 // polar 987 988 template<class _Tp> 989 complex<_Tp> 990 polar(const _Tp& __rho, const _Tp& __theta = _Tp()) 991 { 992 if (__libcpp_isnan_or_builtin(__rho) || signbit(__rho)) 993 return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 994 if (__libcpp_isnan_or_builtin(__theta)) 995 { 996 if (__libcpp_isinf_or_builtin(__rho)) 997 return complex<_Tp>(__rho, __theta); 998 return complex<_Tp>(__theta, __theta); 999 } 1000 if (__libcpp_isinf_or_builtin(__theta)) 1001 { 1002 if (__libcpp_isinf_or_builtin(__rho)) 1003 return complex<_Tp>(__rho, _Tp(NAN)); 1004 return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 1005 } 1006 _Tp __x = __rho * cos(__theta); 1007 if (__libcpp_isnan_or_builtin(__x)) 1008 __x = 0; 1009 _Tp __y = __rho * sin(__theta); 1010 if (__libcpp_isnan_or_builtin(__y)) 1011 __y = 0; 1012 return complex<_Tp>(__x, __y); 1013 } 1014 1015 // log 1016 1017 template<class _Tp> 1018 inline _LIBCPP_INLINE_VISIBILITY 1019 complex<_Tp> 1020 log(const complex<_Tp>& __x) 1021 { 1022 return complex<_Tp>(log(abs(__x)), arg(__x)); 1023 } 1024 1025 // log10 1026 1027 template<class _Tp> 1028 inline _LIBCPP_INLINE_VISIBILITY 1029 complex<_Tp> 1030 log10(const complex<_Tp>& __x) 1031 { 1032 return log(__x) / log(_Tp(10)); 1033 } 1034 1035 // sqrt 1036 1037 template<class _Tp> 1038 complex<_Tp> 1039 sqrt(const complex<_Tp>& __x) 1040 { 1041 if (__libcpp_isinf_or_builtin(__x.imag())) 1042 return complex<_Tp>(_Tp(INFINITY), __x.imag()); 1043 if (__libcpp_isinf_or_builtin(__x.real())) 1044 { 1045 if (__x.real() > _Tp(0)) 1046 return complex<_Tp>(__x.real(), __libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag())); 1047 return complex<_Tp>(__libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag())); 1048 } 1049 return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); 1050 } 1051 1052 // exp 1053 1054 template<class _Tp> 1055 complex<_Tp> 1056 exp(const complex<_Tp>& __x) 1057 { 1058 _Tp __i = __x.imag(); 1059 if (__libcpp_isinf_or_builtin(__x.real())) 1060 { 1061 if (__x.real() < _Tp(0)) 1062 { 1063 if (!__libcpp_isfinite_or_builtin(__i)) 1064 __i = _Tp(1); 1065 } 1066 else if (__i == 0 || !__libcpp_isfinite_or_builtin(__i)) 1067 { 1068 if (__libcpp_isinf_or_builtin(__i)) 1069 __i = _Tp(NAN); 1070 return complex<_Tp>(__x.real(), __i); 1071 } 1072 } 1073 else if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 1074 return __x; 1075 _Tp __e = exp(__x.real()); 1076 return complex<_Tp>(__e * cos(__i), __e * sin(__i)); 1077 } 1078 1079 // pow 1080 1081 template<class _Tp> 1082 inline _LIBCPP_INLINE_VISIBILITY 1083 complex<_Tp> 1084 pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1085 { 1086 return exp(__y * log(__x)); 1087 } 1088 1089 template<class _Tp, class _Up> 1090 inline _LIBCPP_INLINE_VISIBILITY 1091 complex<typename __promote<_Tp, _Up>::type> 1092 pow(const complex<_Tp>& __x, const complex<_Up>& __y) 1093 { 1094 typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1095 return _VSTD::pow(result_type(__x), result_type(__y)); 1096 } 1097 1098 template<class _Tp, class _Up> 1099 inline _LIBCPP_INLINE_VISIBILITY 1100 typename enable_if 1101 < 1102 is_arithmetic<_Up>::value, 1103 complex<typename __promote<_Tp, _Up>::type> 1104 >::type 1105 pow(const complex<_Tp>& __x, const _Up& __y) 1106 { 1107 typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1108 return _VSTD::pow(result_type(__x), result_type(__y)); 1109 } 1110 1111 template<class _Tp, class _Up> 1112 inline _LIBCPP_INLINE_VISIBILITY 1113 typename enable_if 1114 < 1115 is_arithmetic<_Tp>::value, 1116 complex<typename __promote<_Tp, _Up>::type> 1117 >::type 1118 pow(const _Tp& __x, const complex<_Up>& __y) 1119 { 1120 typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1121 return _VSTD::pow(result_type(__x), result_type(__y)); 1122 } 1123 1124 // __sqr, computes pow(x, 2) 1125 1126 template<class _Tp> 1127 inline _LIBCPP_INLINE_VISIBILITY 1128 complex<_Tp> 1129 __sqr(const complex<_Tp>& __x) 1130 { 1131 return complex<_Tp>((__x.real() - __x.imag()) * (__x.real() + __x.imag()), 1132 _Tp(2) * __x.real() * __x.imag()); 1133 } 1134 1135 // asinh 1136 1137 template<class _Tp> 1138 complex<_Tp> 1139 asinh(const complex<_Tp>& __x) 1140 { 1141 const _Tp __pi(atan2(+0., -0.)); 1142 if (__libcpp_isinf_or_builtin(__x.real())) 1143 { 1144 if (__libcpp_isnan_or_builtin(__x.imag())) 1145 return __x; 1146 if (__libcpp_isinf_or_builtin(__x.imag())) 1147 return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 1148 return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 1149 } 1150 if (__libcpp_isnan_or_builtin(__x.real())) 1151 { 1152 if (__libcpp_isinf_or_builtin(__x.imag())) 1153 return complex<_Tp>(__x.imag(), __x.real()); 1154 if (__x.imag() == 0) 1155 return __x; 1156 return complex<_Tp>(__x.real(), __x.real()); 1157 } 1158 if (__libcpp_isinf_or_builtin(__x.imag())) 1159 return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1160 complex<_Tp> __z = log(__x + sqrt(__sqr(__x) + _Tp(1))); 1161 return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 1162 } 1163 1164 // acosh 1165 1166 template<class _Tp> 1167 complex<_Tp> 1168 acosh(const complex<_Tp>& __x) 1169 { 1170 const _Tp __pi(atan2(+0., -0.)); 1171 if (__libcpp_isinf_or_builtin(__x.real())) 1172 { 1173 if (__libcpp_isnan_or_builtin(__x.imag())) 1174 return complex<_Tp>(abs(__x.real()), __x.imag()); 1175 if (__libcpp_isinf_or_builtin(__x.imag())) 1176 { 1177 if (__x.real() > 0) 1178 return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 1179 else 1180 return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag())); 1181 } 1182 if (__x.real() < 0) 1183 return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag())); 1184 return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 1185 } 1186 if (__libcpp_isnan_or_builtin(__x.real())) 1187 { 1188 if (__libcpp_isinf_or_builtin(__x.imag())) 1189 return complex<_Tp>(abs(__x.imag()), __x.real()); 1190 return complex<_Tp>(__x.real(), __x.real()); 1191 } 1192 if (__libcpp_isinf_or_builtin(__x.imag())) 1193 return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag())); 1194 complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 1195 return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag())); 1196 } 1197 1198 // atanh 1199 1200 template<class _Tp> 1201 complex<_Tp> 1202 atanh(const complex<_Tp>& __x) 1203 { 1204 const _Tp __pi(atan2(+0., -0.)); 1205 if (__libcpp_isinf_or_builtin(__x.imag())) 1206 { 1207 return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1208 } 1209 if (__libcpp_isnan_or_builtin(__x.imag())) 1210 { 1211 if (__libcpp_isinf_or_builtin(__x.real()) || __x.real() == 0) 1212 return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag()); 1213 return complex<_Tp>(__x.imag(), __x.imag()); 1214 } 1215 if (__libcpp_isnan_or_builtin(__x.real())) 1216 { 1217 return complex<_Tp>(__x.real(), __x.real()); 1218 } 1219 if (__libcpp_isinf_or_builtin(__x.real())) 1220 { 1221 return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1222 } 1223 if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0)) 1224 { 1225 return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag())); 1226 } 1227 complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2); 1228 return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 1229 } 1230 1231 // sinh 1232 1233 template<class _Tp> 1234 complex<_Tp> 1235 sinh(const complex<_Tp>& __x) 1236 { 1237 if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 1238 return complex<_Tp>(__x.real(), _Tp(NAN)); 1239 if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 1240 return complex<_Tp>(__x.real(), _Tp(NAN)); 1241 if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 1242 return __x; 1243 return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag())); 1244 } 1245 1246 // cosh 1247 1248 template<class _Tp> 1249 complex<_Tp> 1250 cosh(const complex<_Tp>& __x) 1251 { 1252 if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 1253 return complex<_Tp>(abs(__x.real()), _Tp(NAN)); 1254 if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 1255 return complex<_Tp>(_Tp(NAN), __x.real()); 1256 if (__x.real() == 0 && __x.imag() == 0) 1257 return complex<_Tp>(_Tp(1), __x.imag()); 1258 if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 1259 return complex<_Tp>(abs(__x.real()), __x.imag()); 1260 return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag())); 1261 } 1262 1263 // tanh 1264 1265 template<class _Tp> 1266 complex<_Tp> 1267 tanh(const complex<_Tp>& __x) 1268 { 1269 if (__libcpp_isinf_or_builtin(__x.real())) 1270 { 1271 if (!__libcpp_isfinite_or_builtin(__x.imag())) 1272 return complex<_Tp>(_Tp(1), _Tp(0)); 1273 return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag()))); 1274 } 1275 if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 1276 return __x; 1277 _Tp __2r(_Tp(2) * __x.real()); 1278 _Tp __2i(_Tp(2) * __x.imag()); 1279 _Tp __d(cosh(__2r) + cos(__2i)); 1280 _Tp __2rsh(sinh(__2r)); 1281 if (__libcpp_isinf_or_builtin(__2rsh) && __libcpp_isinf_or_builtin(__d)) 1282 return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1), 1283 __2i > _Tp(0) ? _Tp(0) : _Tp(-0.)); 1284 return complex<_Tp>(__2rsh/__d, sin(__2i)/__d); 1285 } 1286 1287 // asin 1288 1289 template<class _Tp> 1290 complex<_Tp> 1291 asin(const complex<_Tp>& __x) 1292 { 1293 complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real())); 1294 return complex<_Tp>(__z.imag(), -__z.real()); 1295 } 1296 1297 // acos 1298 1299 template<class _Tp> 1300 complex<_Tp> 1301 acos(const complex<_Tp>& __x) 1302 { 1303 const _Tp __pi(atan2(+0., -0.)); 1304 if (__libcpp_isinf_or_builtin(__x.real())) 1305 { 1306 if (__libcpp_isnan_or_builtin(__x.imag())) 1307 return complex<_Tp>(__x.imag(), __x.real()); 1308 if (__libcpp_isinf_or_builtin(__x.imag())) 1309 { 1310 if (__x.real() < _Tp(0)) 1311 return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag()); 1312 return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag()); 1313 } 1314 if (__x.real() < _Tp(0)) 1315 return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real()); 1316 return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real()); 1317 } 1318 if (__libcpp_isnan_or_builtin(__x.real())) 1319 { 1320 if (__libcpp_isinf_or_builtin(__x.imag())) 1321 return complex<_Tp>(__x.real(), -__x.imag()); 1322 return complex<_Tp>(__x.real(), __x.real()); 1323 } 1324 if (__libcpp_isinf_or_builtin(__x.imag())) 1325 return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 1326 if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag()))) 1327 return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 1328 complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 1329 if (signbit(__x.imag())) 1330 return complex<_Tp>(abs(__z.imag()), abs(__z.real())); 1331 return complex<_Tp>(abs(__z.imag()), -abs(__z.real())); 1332 } 1333 1334 // atan 1335 1336 template<class _Tp> 1337 complex<_Tp> 1338 atan(const complex<_Tp>& __x) 1339 { 1340 complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real())); 1341 return complex<_Tp>(__z.imag(), -__z.real()); 1342 } 1343 1344 // sin 1345 1346 template<class _Tp> 1347 complex<_Tp> 1348 sin(const complex<_Tp>& __x) 1349 { 1350 complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real())); 1351 return complex<_Tp>(__z.imag(), -__z.real()); 1352 } 1353 1354 // cos 1355 1356 template<class _Tp> 1357 inline _LIBCPP_INLINE_VISIBILITY 1358 complex<_Tp> 1359 cos(const complex<_Tp>& __x) 1360 { 1361 return cosh(complex<_Tp>(-__x.imag(), __x.real())); 1362 } 1363 1364 // tan 1365 1366 template<class _Tp> 1367 complex<_Tp> 1368 tan(const complex<_Tp>& __x) 1369 { 1370 complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real())); 1371 return complex<_Tp>(__z.imag(), -__z.real()); 1372 } 1373 1374 template<class _Tp, class _CharT, class _Traits> 1375 basic_istream<_CharT, _Traits>& 1376 operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) 1377 { 1378 if (__is.good()) 1379 { 1380 ws(__is); 1381 if (__is.peek() == _CharT('(')) 1382 { 1383 __is.get(); 1384 _Tp __r; 1385 __is >> __r; 1386 if (!__is.fail()) 1387 { 1388 ws(__is); 1389 _CharT __c = __is.peek(); 1390 if (__c == _CharT(',')) 1391 { 1392 __is.get(); 1393 _Tp __i; 1394 __is >> __i; 1395 if (!__is.fail()) 1396 { 1397 ws(__is); 1398 __c = __is.peek(); 1399 if (__c == _CharT(')')) 1400 { 1401 __is.get(); 1402 __x = complex<_Tp>(__r, __i); 1403 } 1404 else 1405 __is.setstate(__is.failbit); 1406 } 1407 else 1408 __is.setstate(__is.failbit); 1409 } 1410 else if (__c == _CharT(')')) 1411 { 1412 __is.get(); 1413 __x = complex<_Tp>(__r, _Tp(0)); 1414 } 1415 else 1416 __is.setstate(__is.failbit); 1417 } 1418 else 1419 __is.setstate(__is.failbit); 1420 } 1421 else 1422 { 1423 _Tp __r; 1424 __is >> __r; 1425 if (!__is.fail()) 1426 __x = complex<_Tp>(__r, _Tp(0)); 1427 else 1428 __is.setstate(__is.failbit); 1429 } 1430 } 1431 else 1432 __is.setstate(__is.failbit); 1433 return __is; 1434 } 1435 1436 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION) 1437 template<class _Tp, class _CharT, class _Traits> 1438 basic_ostream<_CharT, _Traits>& 1439 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 1440 { 1441 basic_ostringstream<_CharT, _Traits> __s; 1442 __s.flags(__os.flags()); 1443 __s.imbue(__os.getloc()); 1444 __s.precision(__os.precision()); 1445 __s << '(' << __x.real() << ',' << __x.imag() << ')'; 1446 return __os << __s.str(); 1447 } 1448 #endif // !_LIBCPP_HAS_NO_LOCALIZATION 1449 1450 #if _LIBCPP_STD_VER > 11 1451 // Literal suffix for complex number literals [complex.literals] 1452 inline namespace literals 1453 { 1454 inline namespace complex_literals 1455 { 1456 constexpr complex<long double> operator""il(long double __im) 1457 { 1458 return { 0.0l, __im }; 1459 } 1460 1461 constexpr complex<long double> operator""il(unsigned long long __im) 1462 { 1463 return { 0.0l, static_cast<long double>(__im) }; 1464 } 1465 1466 1467 constexpr complex<double> operator""i(long double __im) 1468 { 1469 return { 0.0, static_cast<double>(__im) }; 1470 } 1471 1472 constexpr complex<double> operator""i(unsigned long long __im) 1473 { 1474 return { 0.0, static_cast<double>(__im) }; 1475 } 1476 1477 1478 constexpr complex<float> operator""if(long double __im) 1479 { 1480 return { 0.0f, static_cast<float>(__im) }; 1481 } 1482 1483 constexpr complex<float> operator""if(unsigned long long __im) 1484 { 1485 return { 0.0f, static_cast<float>(__im) }; 1486 } 1487 } 1488 } 1489 #endif 1490 1491 _LIBCPP_END_NAMESPACE_STD 1492 1493 #endif // _LIBCPP_COMPLEX 1494