1 1.1 mrg // The template and inlines for the -*- C++ -*- complex number classes. 2 1.1 mrg 3 1.15 mrg // Copyright (C) 1997-2024 Free Software Foundation, Inc. 4 1.1 mrg // 5 1.1 mrg // This file is part of the GNU ISO C++ Library. This library is free 6 1.1 mrg // software; you can redistribute it and/or modify it under the 7 1.1 mrg // terms of the GNU General Public License as published by the 8 1.1 mrg // Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg // any later version. 10 1.1 mrg 11 1.1 mrg // This library is distributed in the hope that it will be useful, 12 1.1 mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg // GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg // Under Section 7 of GPL version 3, you are granted additional 17 1.1 mrg // permissions described in the GCC Runtime Library Exception, version 18 1.1 mrg // 3.1, as published by the Free Software Foundation. 19 1.1 mrg 20 1.1 mrg // You should have received a copy of the GNU General Public License and 21 1.1 mrg // a copy of the GCC Runtime Library Exception along with this program; 22 1.1 mrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 1.1 mrg // <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1 mrg /** @file include/complex 26 1.1 mrg * This is a Standard C++ Library header. 27 1.1 mrg */ 28 1.1 mrg 29 1.1 mrg // 30 1.1 mrg // ISO C++ 14882: 26.2 Complex Numbers 31 1.1 mrg // Note: this is not a conforming implementation. 32 1.1 mrg // Initially implemented by Ulrich Drepper <drepper (a] cygnus.com> 33 1.1 mrg // Improved by Gabriel Dos Reis <dosreis (a] cmla.ens-cachan.fr> 34 1.1 mrg // 35 1.1 mrg 36 1.1 mrg #ifndef _GLIBCXX_COMPLEX 37 1.1 mrg #define _GLIBCXX_COMPLEX 1 38 1.1 mrg 39 1.1 mrg #pragma GCC system_header 40 1.1 mrg 41 1.1 mrg #include <bits/c++config.h> 42 1.1 mrg #include <bits/cpp_type_traits.h> 43 1.1 mrg #include <ext/type_traits.h> 44 1.1 mrg #include <cmath> 45 1.1 mrg #include <sstream> 46 1.1 mrg 47 1.2 christos #if _GLIBCXX_USE_C99_COMPLEX 48 1.3 wiz // This is disgusting; we can't include ccomplex because that requires c++11 49 1.2 christos // and we can't use the builtins because those point to the wrong 50 1.2 christos // ABI-wise cabs/cabsf so we manually declare those here and use 51 1.2 christos // them directly. 52 1.2 christos extern "C" float __c99_cabsf(_Complex float); 53 1.2 christos extern "C" double __c99_cabs(_Complex double); 54 1.2 christos extern "C" long double __c99_cabsl(_Complex long double); 55 1.2 christos #endif 56 1.2 christos 57 1.2 christos // Get rid of a macro possibly defined in <complex.h> 58 1.2 christos #undef complex 59 1.2 christos 60 1.15 mrg #ifdef __clang__ 61 1.15 mrg #pragma clang diagnostic push 62 1.15 mrg #pragma clang diagnostic ignored "-Wc99-extensions" 63 1.11 mrg #endif 64 1.11 mrg 65 1.15 mrg #define __glibcxx_want_constexpr_complex 66 1.15 mrg #define __glibcxx_want_complex_udls 67 1.15 mrg #include <bits/version.h> 68 1.15 mrg 69 1.2 christos namespace std _GLIBCXX_VISIBILITY(default) 70 1.2 christos { 71 1.2 christos _GLIBCXX_BEGIN_NAMESPACE_VERSION 72 1.1 mrg 73 1.1 mrg /** 74 1.1 mrg * @defgroup complex_numbers Complex Numbers 75 1.1 mrg * @ingroup numerics 76 1.1 mrg * 77 1.1 mrg * Classes and functions for complex numbers. 78 1.1 mrg * @{ 79 1.1 mrg */ 80 1.1 mrg 81 1.1 mrg // Forward declarations. 82 1.1 mrg template<typename _Tp> class complex; 83 1.1 mrg template<> class complex<float>; 84 1.1 mrg template<> class complex<double>; 85 1.1 mrg template<> class complex<long double>; 86 1.1 mrg 87 1.1 mrg /// Return magnitude of @a z. 88 1.1 mrg template<typename _Tp> _Tp abs(const complex<_Tp>&); 89 1.1 mrg /// Return phase angle of @a z. 90 1.1 mrg template<typename _Tp> _Tp arg(const complex<_Tp>&); 91 1.1 mrg /// Return @a z magnitude squared. 92 1.10 mrg template<typename _Tp> _Tp _GLIBCXX20_CONSTEXPR norm(const complex<_Tp>&); 93 1.1 mrg 94 1.1 mrg /// Return complex conjugate of @a z. 95 1.10 mrg template<typename _Tp> 96 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp> conj(const complex<_Tp>&); 97 1.1 mrg /// Return complex with magnitude @a rho and angle @a theta. 98 1.1 mrg template<typename _Tp> complex<_Tp> polar(const _Tp&, const _Tp& = 0); 99 1.1 mrg 100 1.1 mrg // Transcendentals: 101 1.1 mrg /// Return complex cosine of @a z. 102 1.1 mrg template<typename _Tp> complex<_Tp> cos(const complex<_Tp>&); 103 1.1 mrg /// Return complex hyperbolic cosine of @a z. 104 1.1 mrg template<typename _Tp> complex<_Tp> cosh(const complex<_Tp>&); 105 1.1 mrg /// Return complex base e exponential of @a z. 106 1.1 mrg template<typename _Tp> complex<_Tp> exp(const complex<_Tp>&); 107 1.1 mrg /// Return complex natural logarithm of @a z. 108 1.1 mrg template<typename _Tp> complex<_Tp> log(const complex<_Tp>&); 109 1.1 mrg /// Return complex base 10 logarithm of @a z. 110 1.1 mrg template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&); 111 1.1 mrg /// Return @a x to the @a y'th power. 112 1.1 mrg template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int); 113 1.1 mrg /// Return @a x to the @a y'th power. 114 1.1 mrg template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&); 115 1.1 mrg /// Return @a x to the @a y'th power. 116 1.8 mrg template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, 117 1.1 mrg const complex<_Tp>&); 118 1.1 mrg /// Return @a x to the @a y'th power. 119 1.1 mrg template<typename _Tp> complex<_Tp> pow(const _Tp&, const complex<_Tp>&); 120 1.1 mrg /// Return complex sine of @a z. 121 1.1 mrg template<typename _Tp> complex<_Tp> sin(const complex<_Tp>&); 122 1.1 mrg /// Return complex hyperbolic sine of @a z. 123 1.1 mrg template<typename _Tp> complex<_Tp> sinh(const complex<_Tp>&); 124 1.1 mrg /// Return complex square root of @a z. 125 1.1 mrg template<typename _Tp> complex<_Tp> sqrt(const complex<_Tp>&); 126 1.1 mrg /// Return complex tangent of @a z. 127 1.1 mrg template<typename _Tp> complex<_Tp> tan(const complex<_Tp>&); 128 1.1 mrg /// Return complex hyperbolic tangent of @a z. 129 1.1 mrg template<typename _Tp> complex<_Tp> tanh(const complex<_Tp>&); 130 1.8 mrg 131 1.8 mrg 132 1.1 mrg // 26.2.2 Primary template class complex 133 1.1 mrg /** 134 1.1 mrg * Template to represent complex numbers. 135 1.1 mrg * 136 1.1 mrg * Specializations for float, double, and long double are part of the 137 1.1 mrg * library. Results with any other type are not guaranteed. 138 1.1 mrg * 139 1.1 mrg * @param Tp Type of real and imaginary values. 140 1.1 mrg */ 141 1.1 mrg template<typename _Tp> 142 1.13 mrg class complex 143 1.1 mrg { 144 1.13 mrg public: 145 1.1 mrg /// Value typedef. 146 1.1 mrg typedef _Tp value_type; 147 1.8 mrg 148 1.1 mrg /// Default constructor. First parameter is x, second parameter is y. 149 1.1 mrg /// Unspecified parameters default to 0. 150 1.2 christos _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp()) 151 1.1 mrg : _M_real(__r), _M_imag(__i) { } 152 1.1 mrg 153 1.4 mrg // Let the compiler synthesize the copy constructor 154 1.4 mrg #if __cplusplus >= 201103L 155 1.4 mrg constexpr complex(const complex&) = default; 156 1.4 mrg #endif 157 1.4 mrg 158 1.4 mrg /// Converting constructor. 159 1.1 mrg template<typename _Up> 160 1.15 mrg #if __cplusplus > 202002L 161 1.15 mrg explicit(!requires(_Up __u) { _Tp{__u}; }) 162 1.15 mrg #endif 163 1.15 mrg _GLIBCXX_CONSTEXPR complex(const complex<_Up>& __z) 164 1.15 mrg : _M_real(_Tp(__z.real())), _M_imag(_Tp(__z.imag())) { } 165 1.1 mrg 166 1.2 christos #if __cplusplus >= 201103L 167 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 168 1.1 mrg // DR 387. std::complex over-encapsulated. 169 1.2 christos _GLIBCXX_ABI_TAG_CXX11 170 1.8 mrg constexpr _Tp 171 1.4 mrg real() const { return _M_real; } 172 1.2 christos 173 1.2 christos _GLIBCXX_ABI_TAG_CXX11 174 1.8 mrg constexpr _Tp 175 1.4 mrg imag() const { return _M_imag; } 176 1.1 mrg #else 177 1.1 mrg /// Return real part of complex number. 178 1.8 mrg _Tp& 179 1.2 christos real() { return _M_real; } 180 1.1 mrg 181 1.1 mrg /// Return real part of complex number. 182 1.8 mrg const _Tp& 183 1.2 christos real() const { return _M_real; } 184 1.1 mrg 185 1.1 mrg /// Return imaginary part of complex number. 186 1.8 mrg _Tp& 187 1.2 christos imag() { return _M_imag; } 188 1.1 mrg 189 1.1 mrg /// Return imaginary part of complex number. 190 1.8 mrg const _Tp& 191 1.2 christos imag() const { return _M_imag; } 192 1.1 mrg #endif 193 1.1 mrg 194 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 195 1.1 mrg // DR 387. std::complex over-encapsulated. 196 1.10 mrg _GLIBCXX20_CONSTEXPR void 197 1.2 christos real(_Tp __val) { _M_real = __val; } 198 1.1 mrg 199 1.10 mrg _GLIBCXX20_CONSTEXPR void 200 1.2 christos imag(_Tp __val) { _M_imag = __val; } 201 1.1 mrg 202 1.4 mrg /// Assign a scalar to this complex number. 203 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const _Tp&); 204 1.8 mrg 205 1.4 mrg /// Add a scalar to this complex number. 206 1.1 mrg // 26.2.5/1 207 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 208 1.1 mrg operator+=(const _Tp& __t) 209 1.1 mrg { 210 1.1 mrg _M_real += __t; 211 1.1 mrg return *this; 212 1.1 mrg } 213 1.1 mrg 214 1.4 mrg /// Subtract a scalar from this complex number. 215 1.1 mrg // 26.2.5/3 216 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 217 1.1 mrg operator-=(const _Tp& __t) 218 1.1 mrg { 219 1.1 mrg _M_real -= __t; 220 1.1 mrg return *this; 221 1.1 mrg } 222 1.1 mrg 223 1.4 mrg /// Multiply this complex number by a scalar. 224 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const _Tp&); 225 1.4 mrg /// Divide this complex number by a scalar. 226 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const _Tp&); 227 1.1 mrg 228 1.4 mrg // Let the compiler synthesize the copy assignment operator 229 1.4 mrg #if __cplusplus >= 201103L 230 1.10 mrg _GLIBCXX20_CONSTEXPR complex& operator=(const complex&) = default; 231 1.4 mrg #endif 232 1.4 mrg 233 1.4 mrg /// Assign another complex number to this one. 234 1.1 mrg template<typename _Up> 235 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const complex<_Up>&); 236 1.4 mrg /// Add another complex number to this one. 237 1.1 mrg template<typename _Up> 238 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator+=(const complex<_Up>&); 239 1.4 mrg /// Subtract another complex number from this one. 240 1.1 mrg template<typename _Up> 241 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator-=(const complex<_Up>&); 242 1.4 mrg /// Multiply this complex number by another. 243 1.1 mrg template<typename _Up> 244 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const complex<_Up>&); 245 1.4 mrg /// Divide this complex number by another. 246 1.1 mrg template<typename _Up> 247 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const complex<_Up>&); 248 1.1 mrg 249 1.4 mrg _GLIBCXX_CONSTEXPR complex __rep() const 250 1.1 mrg { return *this; } 251 1.1 mrg 252 1.1 mrg private: 253 1.1 mrg _Tp _M_real; 254 1.1 mrg _Tp _M_imag; 255 1.1 mrg }; 256 1.1 mrg 257 1.1 mrg template<typename _Tp> 258 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 259 1.1 mrg complex<_Tp>::operator=(const _Tp& __t) 260 1.1 mrg { 261 1.1 mrg _M_real = __t; 262 1.1 mrg _M_imag = _Tp(); 263 1.1 mrg return *this; 264 1.8 mrg } 265 1.1 mrg 266 1.1 mrg // 26.2.5/5 267 1.1 mrg template<typename _Tp> 268 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 269 1.1 mrg complex<_Tp>::operator*=(const _Tp& __t) 270 1.1 mrg { 271 1.1 mrg _M_real *= __t; 272 1.1 mrg _M_imag *= __t; 273 1.1 mrg return *this; 274 1.1 mrg } 275 1.1 mrg 276 1.1 mrg // 26.2.5/7 277 1.1 mrg template<typename _Tp> 278 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 279 1.1 mrg complex<_Tp>::operator/=(const _Tp& __t) 280 1.1 mrg { 281 1.1 mrg _M_real /= __t; 282 1.1 mrg _M_imag /= __t; 283 1.1 mrg return *this; 284 1.1 mrg } 285 1.1 mrg 286 1.1 mrg template<typename _Tp> 287 1.1 mrg template<typename _Up> 288 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 289 1.1 mrg complex<_Tp>::operator=(const complex<_Up>& __z) 290 1.1 mrg { 291 1.1 mrg _M_real = __z.real(); 292 1.1 mrg _M_imag = __z.imag(); 293 1.1 mrg return *this; 294 1.1 mrg } 295 1.1 mrg 296 1.1 mrg // 26.2.5/9 297 1.1 mrg template<typename _Tp> 298 1.1 mrg template<typename _Up> 299 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 300 1.1 mrg complex<_Tp>::operator+=(const complex<_Up>& __z) 301 1.1 mrg { 302 1.1 mrg _M_real += __z.real(); 303 1.1 mrg _M_imag += __z.imag(); 304 1.1 mrg return *this; 305 1.1 mrg } 306 1.1 mrg 307 1.1 mrg // 26.2.5/11 308 1.1 mrg template<typename _Tp> 309 1.1 mrg template<typename _Up> 310 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 311 1.1 mrg complex<_Tp>::operator-=(const complex<_Up>& __z) 312 1.1 mrg { 313 1.1 mrg _M_real -= __z.real(); 314 1.1 mrg _M_imag -= __z.imag(); 315 1.1 mrg return *this; 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg // 26.2.5/13 319 1.1 mrg // XXX: This is a grammar school implementation. 320 1.1 mrg template<typename _Tp> 321 1.1 mrg template<typename _Up> 322 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 323 1.1 mrg complex<_Tp>::operator*=(const complex<_Up>& __z) 324 1.1 mrg { 325 1.1 mrg const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag(); 326 1.1 mrg _M_imag = _M_real * __z.imag() + _M_imag * __z.real(); 327 1.1 mrg _M_real = __r; 328 1.1 mrg return *this; 329 1.1 mrg } 330 1.1 mrg 331 1.1 mrg // 26.2.5/15 332 1.1 mrg // XXX: This is a grammar school implementation. 333 1.1 mrg template<typename _Tp> 334 1.1 mrg template<typename _Up> 335 1.10 mrg _GLIBCXX20_CONSTEXPR complex<_Tp>& 336 1.1 mrg complex<_Tp>::operator/=(const complex<_Up>& __z) 337 1.1 mrg { 338 1.1 mrg const _Tp __r = _M_real * __z.real() + _M_imag * __z.imag(); 339 1.1 mrg const _Tp __n = std::norm(__z); 340 1.1 mrg _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n; 341 1.1 mrg _M_real = __r / __n; 342 1.1 mrg return *this; 343 1.1 mrg } 344 1.8 mrg 345 1.1 mrg // Operators: 346 1.12 mrg ///@{ 347 1.1 mrg /// Return new complex value @a x plus @a y. 348 1.1 mrg template<typename _Tp> 349 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 350 1.1 mrg operator+(const complex<_Tp>& __x, const complex<_Tp>& __y) 351 1.1 mrg { 352 1.1 mrg complex<_Tp> __r = __x; 353 1.1 mrg __r += __y; 354 1.1 mrg return __r; 355 1.1 mrg } 356 1.1 mrg 357 1.1 mrg template<typename _Tp> 358 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 359 1.1 mrg operator+(const complex<_Tp>& __x, const _Tp& __y) 360 1.1 mrg { 361 1.1 mrg complex<_Tp> __r = __x; 362 1.1 mrg __r += __y; 363 1.1 mrg return __r; 364 1.1 mrg } 365 1.1 mrg 366 1.1 mrg template<typename _Tp> 367 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 368 1.1 mrg operator+(const _Tp& __x, const complex<_Tp>& __y) 369 1.1 mrg { 370 1.1 mrg complex<_Tp> __r = __y; 371 1.1 mrg __r += __x; 372 1.1 mrg return __r; 373 1.1 mrg } 374 1.12 mrg ///@} 375 1.1 mrg 376 1.12 mrg ///@{ 377 1.1 mrg /// Return new complex value @a x minus @a y. 378 1.1 mrg template<typename _Tp> 379 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 380 1.1 mrg operator-(const complex<_Tp>& __x, const complex<_Tp>& __y) 381 1.1 mrg { 382 1.1 mrg complex<_Tp> __r = __x; 383 1.1 mrg __r -= __y; 384 1.1 mrg return __r; 385 1.1 mrg } 386 1.8 mrg 387 1.1 mrg template<typename _Tp> 388 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 389 1.1 mrg operator-(const complex<_Tp>& __x, const _Tp& __y) 390 1.1 mrg { 391 1.1 mrg complex<_Tp> __r = __x; 392 1.1 mrg __r -= __y; 393 1.1 mrg return __r; 394 1.1 mrg } 395 1.1 mrg 396 1.1 mrg template<typename _Tp> 397 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 398 1.1 mrg operator-(const _Tp& __x, const complex<_Tp>& __y) 399 1.1 mrg { 400 1.10 mrg complex<_Tp> __r = -__y; 401 1.10 mrg __r += __x; 402 1.1 mrg return __r; 403 1.1 mrg } 404 1.12 mrg ///@} 405 1.1 mrg 406 1.12 mrg ///@{ 407 1.1 mrg /// Return new complex value @a x times @a y. 408 1.1 mrg template<typename _Tp> 409 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 410 1.1 mrg operator*(const complex<_Tp>& __x, const complex<_Tp>& __y) 411 1.1 mrg { 412 1.1 mrg complex<_Tp> __r = __x; 413 1.1 mrg __r *= __y; 414 1.1 mrg return __r; 415 1.1 mrg } 416 1.1 mrg 417 1.1 mrg template<typename _Tp> 418 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 419 1.1 mrg operator*(const complex<_Tp>& __x, const _Tp& __y) 420 1.1 mrg { 421 1.1 mrg complex<_Tp> __r = __x; 422 1.1 mrg __r *= __y; 423 1.1 mrg return __r; 424 1.1 mrg } 425 1.1 mrg 426 1.1 mrg template<typename _Tp> 427 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 428 1.1 mrg operator*(const _Tp& __x, const complex<_Tp>& __y) 429 1.1 mrg { 430 1.1 mrg complex<_Tp> __r = __y; 431 1.1 mrg __r *= __x; 432 1.1 mrg return __r; 433 1.1 mrg } 434 1.12 mrg ///@} 435 1.1 mrg 436 1.12 mrg ///@{ 437 1.1 mrg /// Return new complex value @a x divided by @a y. 438 1.1 mrg template<typename _Tp> 439 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 440 1.1 mrg operator/(const complex<_Tp>& __x, const complex<_Tp>& __y) 441 1.1 mrg { 442 1.1 mrg complex<_Tp> __r = __x; 443 1.1 mrg __r /= __y; 444 1.1 mrg return __r; 445 1.1 mrg } 446 1.8 mrg 447 1.1 mrg template<typename _Tp> 448 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 449 1.1 mrg operator/(const complex<_Tp>& __x, const _Tp& __y) 450 1.1 mrg { 451 1.1 mrg complex<_Tp> __r = __x; 452 1.1 mrg __r /= __y; 453 1.1 mrg return __r; 454 1.1 mrg } 455 1.1 mrg 456 1.1 mrg template<typename _Tp> 457 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 458 1.1 mrg operator/(const _Tp& __x, const complex<_Tp>& __y) 459 1.1 mrg { 460 1.1 mrg complex<_Tp> __r = __x; 461 1.1 mrg __r /= __y; 462 1.1 mrg return __r; 463 1.1 mrg } 464 1.12 mrg ///@} 465 1.1 mrg 466 1.1 mrg /// Return @a x. 467 1.1 mrg template<typename _Tp> 468 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 469 1.1 mrg operator+(const complex<_Tp>& __x) 470 1.1 mrg { return __x; } 471 1.1 mrg 472 1.1 mrg /// Return complex negation of @a x. 473 1.1 mrg template<typename _Tp> 474 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 475 1.1 mrg operator-(const complex<_Tp>& __x) 476 1.10 mrg { return complex<_Tp>(-__x.real(), -__x.imag()); } 477 1.1 mrg 478 1.12 mrg ///@{ 479 1.1 mrg /// Return true if @a x is equal to @a y. 480 1.1 mrg template<typename _Tp> 481 1.2 christos inline _GLIBCXX_CONSTEXPR bool 482 1.1 mrg operator==(const complex<_Tp>& __x, const complex<_Tp>& __y) 483 1.1 mrg { return __x.real() == __y.real() && __x.imag() == __y.imag(); } 484 1.1 mrg 485 1.1 mrg template<typename _Tp> 486 1.2 christos inline _GLIBCXX_CONSTEXPR bool 487 1.1 mrg operator==(const complex<_Tp>& __x, const _Tp& __y) 488 1.1 mrg { return __x.real() == __y && __x.imag() == _Tp(); } 489 1.1 mrg 490 1.11 mrg #if !(__cpp_impl_three_way_comparison >= 201907L) 491 1.1 mrg template<typename _Tp> 492 1.2 christos inline _GLIBCXX_CONSTEXPR bool 493 1.1 mrg operator==(const _Tp& __x, const complex<_Tp>& __y) 494 1.1 mrg { return __x == __y.real() && _Tp() == __y.imag(); } 495 1.12 mrg ///@} 496 1.1 mrg 497 1.12 mrg ///@{ 498 1.1 mrg /// Return false if @a x is equal to @a y. 499 1.1 mrg template<typename _Tp> 500 1.2 christos inline _GLIBCXX_CONSTEXPR bool 501 1.1 mrg operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) 502 1.1 mrg { return __x.real() != __y.real() || __x.imag() != __y.imag(); } 503 1.1 mrg 504 1.1 mrg template<typename _Tp> 505 1.2 christos inline _GLIBCXX_CONSTEXPR bool 506 1.1 mrg operator!=(const complex<_Tp>& __x, const _Tp& __y) 507 1.1 mrg { return __x.real() != __y || __x.imag() != _Tp(); } 508 1.1 mrg 509 1.1 mrg template<typename _Tp> 510 1.2 christos inline _GLIBCXX_CONSTEXPR bool 511 1.1 mrg operator!=(const _Tp& __x, const complex<_Tp>& __y) 512 1.1 mrg { return __x != __y.real() || _Tp() != __y.imag(); } 513 1.11 mrg #endif 514 1.12 mrg ///@} 515 1.1 mrg 516 1.1 mrg /// Extraction operator for complex values. 517 1.1 mrg template<typename _Tp, typename _CharT, class _Traits> 518 1.1 mrg basic_istream<_CharT, _Traits>& 519 1.1 mrg operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) 520 1.1 mrg { 521 1.9 mrg bool __fail = true; 522 1.9 mrg _CharT __ch; 523 1.9 mrg if (__is >> __ch) 524 1.1 mrg { 525 1.9 mrg if (_Traits::eq(__ch, __is.widen('('))) 526 1.1 mrg { 527 1.9 mrg _Tp __u; 528 1.9 mrg if (__is >> __u >> __ch) 529 1.9 mrg { 530 1.9 mrg const _CharT __rparen = __is.widen(')'); 531 1.9 mrg if (_Traits::eq(__ch, __rparen)) 532 1.9 mrg { 533 1.9 mrg __x = __u; 534 1.9 mrg __fail = false; 535 1.9 mrg } 536 1.9 mrg else if (_Traits::eq(__ch, __is.widen(','))) 537 1.9 mrg { 538 1.9 mrg _Tp __v; 539 1.9 mrg if (__is >> __v >> __ch) 540 1.9 mrg { 541 1.9 mrg if (_Traits::eq(__ch, __rparen)) 542 1.9 mrg { 543 1.9 mrg __x = complex<_Tp>(__u, __v); 544 1.9 mrg __fail = false; 545 1.9 mrg } 546 1.9 mrg else 547 1.9 mrg __is.putback(__ch); 548 1.9 mrg } 549 1.9 mrg } 550 1.9 mrg else 551 1.9 mrg __is.putback(__ch); 552 1.9 mrg } 553 1.1 mrg } 554 1.1 mrg else 555 1.9 mrg { 556 1.9 mrg __is.putback(__ch); 557 1.9 mrg _Tp __u; 558 1.9 mrg if (__is >> __u) 559 1.9 mrg { 560 1.9 mrg __x = __u; 561 1.9 mrg __fail = false; 562 1.9 mrg } 563 1.9 mrg } 564 1.1 mrg } 565 1.9 mrg if (__fail) 566 1.9 mrg __is.setstate(ios_base::failbit); 567 1.1 mrg return __is; 568 1.1 mrg } 569 1.1 mrg 570 1.1 mrg /// Insertion operator for complex values. 571 1.1 mrg template<typename _Tp, typename _CharT, class _Traits> 572 1.1 mrg basic_ostream<_CharT, _Traits>& 573 1.1 mrg operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 574 1.1 mrg { 575 1.1 mrg basic_ostringstream<_CharT, _Traits> __s; 576 1.1 mrg __s.flags(__os.flags()); 577 1.1 mrg __s.imbue(__os.getloc()); 578 1.1 mrg __s.precision(__os.precision()); 579 1.1 mrg __s << '(' << __x.real() << ',' << __x.imag() << ')'; 580 1.1 mrg return __os << __s.str(); 581 1.1 mrg } 582 1.1 mrg 583 1.1 mrg // Values 584 1.2 christos #if __cplusplus >= 201103L 585 1.1 mrg template<typename _Tp> 586 1.2 christos constexpr _Tp 587 1.1 mrg real(const complex<_Tp>& __z) 588 1.1 mrg { return __z.real(); } 589 1.2 christos 590 1.1 mrg template<typename _Tp> 591 1.2 christos constexpr _Tp 592 1.1 mrg imag(const complex<_Tp>& __z) 593 1.1 mrg { return __z.imag(); } 594 1.1 mrg #else 595 1.1 mrg template<typename _Tp> 596 1.1 mrg inline _Tp& 597 1.1 mrg real(complex<_Tp>& __z) 598 1.1 mrg { return __z.real(); } 599 1.8 mrg 600 1.1 mrg template<typename _Tp> 601 1.1 mrg inline const _Tp& 602 1.1 mrg real(const complex<_Tp>& __z) 603 1.1 mrg { return __z.real(); } 604 1.8 mrg 605 1.1 mrg template<typename _Tp> 606 1.1 mrg inline _Tp& 607 1.1 mrg imag(complex<_Tp>& __z) 608 1.1 mrg { return __z.imag(); } 609 1.8 mrg 610 1.1 mrg template<typename _Tp> 611 1.1 mrg inline const _Tp& 612 1.1 mrg imag(const complex<_Tp>& __z) 613 1.1 mrg { return __z.imag(); } 614 1.1 mrg #endif 615 1.1 mrg 616 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX 617 1.15 mrg #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 618 1.15 mrg inline _Float16 619 1.15 mrg __complex_abs(__complex__ _Float16 __z) 620 1.15 mrg { return _Float16(__builtin_cabsf(__z)); } 621 1.15 mrg 622 1.15 mrg inline _Float16 623 1.15 mrg __complex_arg(__complex__ _Float16 __z) 624 1.15 mrg { return _Float16(__builtin_cargf(__z)); } 625 1.15 mrg 626 1.15 mrg inline __complex__ _Float16 627 1.15 mrg __complex_cos(__complex__ _Float16 __z) 628 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_ccosf(__z)); } 629 1.15 mrg 630 1.15 mrg inline __complex__ _Float16 631 1.15 mrg __complex_cosh(__complex__ _Float16 __z) 632 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_ccoshf(__z)); } 633 1.15 mrg 634 1.15 mrg inline __complex__ _Float16 635 1.15 mrg __complex_exp(__complex__ _Float16 __z) 636 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_cexpf(__z)); } 637 1.15 mrg 638 1.15 mrg inline __complex__ _Float16 639 1.15 mrg __complex_log(__complex__ _Float16 __z) 640 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_clogf(__z)); } 641 1.15 mrg 642 1.15 mrg inline __complex__ _Float16 643 1.15 mrg __complex_sin(__complex__ _Float16 __z) 644 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_csinf(__z)); } 645 1.15 mrg 646 1.15 mrg inline __complex__ _Float16 647 1.15 mrg __complex_sinh(__complex__ _Float16 __z) 648 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_csinhf(__z)); } 649 1.15 mrg 650 1.15 mrg inline __complex__ _Float16 651 1.15 mrg __complex_sqrt(__complex__ _Float16 __z) 652 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_csqrtf(__z)); } 653 1.15 mrg 654 1.15 mrg inline __complex__ _Float16 655 1.15 mrg __complex_tan(__complex__ _Float16 __z) 656 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_ctanf(__z)); } 657 1.15 mrg 658 1.15 mrg inline __complex__ _Float16 659 1.15 mrg __complex_tanh(__complex__ _Float16 __z) 660 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_ctanhf(__z)); } 661 1.15 mrg 662 1.15 mrg inline __complex__ _Float16 663 1.15 mrg __complex_pow(__complex__ _Float16 __x, __complex__ _Float16 __y) 664 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_cpowf(__x, __y)); } 665 1.15 mrg #endif 666 1.15 mrg 667 1.15 mrg #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 668 1.15 mrg inline _Float32 669 1.15 mrg __complex_abs(__complex__ _Float32 __z) { return __builtin_cabsf(__z); } 670 1.15 mrg 671 1.15 mrg inline _Float32 672 1.15 mrg __complex_arg(__complex__ _Float32 __z) { return __builtin_cargf(__z); } 673 1.15 mrg 674 1.15 mrg inline __complex__ _Float32 675 1.15 mrg __complex_cos(__complex__ _Float32 __z) { return __builtin_ccosf(__z); } 676 1.15 mrg 677 1.15 mrg inline __complex__ _Float32 678 1.15 mrg __complex_cosh(__complex__ _Float32 __z) { return __builtin_ccoshf(__z); } 679 1.15 mrg 680 1.15 mrg inline __complex__ _Float32 681 1.15 mrg __complex_exp(__complex__ _Float32 __z) { return __builtin_cexpf(__z); } 682 1.15 mrg 683 1.15 mrg inline __complex__ _Float32 684 1.15 mrg __complex_log(__complex__ _Float32 __z) { return __builtin_clogf(__z); } 685 1.15 mrg 686 1.15 mrg inline __complex__ _Float32 687 1.15 mrg __complex_sin(__complex__ _Float32 __z) { return __builtin_csinf(__z); } 688 1.15 mrg 689 1.15 mrg inline __complex__ _Float32 690 1.15 mrg __complex_sinh(__complex__ _Float32 __z) { return __builtin_csinhf(__z); } 691 1.15 mrg 692 1.15 mrg inline __complex__ _Float32 693 1.15 mrg __complex_sqrt(__complex__ _Float32 __z) { return __builtin_csqrtf(__z); } 694 1.15 mrg 695 1.15 mrg inline __complex__ _Float32 696 1.15 mrg __complex_tan(__complex__ _Float32 __z) { return __builtin_ctanf(__z); } 697 1.15 mrg 698 1.15 mrg inline __complex__ _Float32 699 1.15 mrg __complex_tanh(__complex__ _Float32 __z) { return __builtin_ctanhf(__z); } 700 1.15 mrg 701 1.15 mrg inline __complex__ _Float32 702 1.15 mrg __complex_pow(__complex__ _Float32 __x, __complex__ _Float32 __y) 703 1.15 mrg { return __builtin_cpowf(__x, __y); } 704 1.15 mrg #endif 705 1.15 mrg 706 1.15 mrg #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) 707 1.15 mrg inline _Float64 708 1.15 mrg __complex_abs(__complex__ _Float64 __z) { return __builtin_cabs(__z); } 709 1.15 mrg 710 1.15 mrg inline _Float64 711 1.15 mrg __complex_arg(__complex__ _Float64 __z) { return __builtin_carg(__z); } 712 1.15 mrg 713 1.15 mrg inline __complex__ _Float64 714 1.15 mrg __complex_cos(__complex__ _Float64 __z) { return __builtin_ccos(__z); } 715 1.15 mrg 716 1.15 mrg inline __complex__ _Float64 717 1.15 mrg __complex_cosh(__complex__ _Float64 __z) { return __builtin_ccosh(__z); } 718 1.15 mrg 719 1.15 mrg inline __complex__ _Float64 720 1.15 mrg __complex_exp(__complex__ _Float64 __z) { return __builtin_cexp(__z); } 721 1.15 mrg 722 1.15 mrg inline __complex__ _Float64 723 1.15 mrg __complex_log(__complex__ _Float64 __z) { return __builtin_clog(__z); } 724 1.15 mrg 725 1.15 mrg inline __complex__ _Float64 726 1.15 mrg __complex_sin(__complex__ _Float64 __z) { return __builtin_csin(__z); } 727 1.15 mrg 728 1.15 mrg inline __complex__ _Float64 729 1.15 mrg __complex_sinh(__complex__ _Float64 __z) { return __builtin_csinh(__z); } 730 1.15 mrg 731 1.15 mrg inline __complex__ _Float64 732 1.15 mrg __complex_sqrt(__complex__ _Float64 __z) { return __builtin_csqrt(__z); } 733 1.15 mrg 734 1.15 mrg inline __complex__ _Float64 735 1.15 mrg __complex_tan(__complex__ _Float64 __z) { return __builtin_ctan(__z); } 736 1.15 mrg 737 1.15 mrg inline __complex__ _Float64 738 1.15 mrg __complex_tanh(__complex__ _Float64 __z) { return __builtin_ctanh(__z); } 739 1.15 mrg 740 1.15 mrg inline __complex__ _Float64 741 1.15 mrg __complex_pow(__complex__ _Float64 __x, __complex__ _Float64 __y) 742 1.15 mrg { return __builtin_cpow(__x, __y); } 743 1.15 mrg #endif 744 1.15 mrg 745 1.15 mrg #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) 746 1.15 mrg inline _Float128 747 1.15 mrg __complex_abs(__complex__ _Float128 __z) { return __builtin_cabsl(__z); } 748 1.15 mrg 749 1.15 mrg inline _Float128 750 1.15 mrg __complex_arg(__complex__ _Float128 __z) { return __builtin_cargl(__z); } 751 1.15 mrg 752 1.15 mrg inline __complex__ _Float128 753 1.15 mrg __complex_cos(__complex__ _Float128 __z) { return __builtin_ccosl(__z); } 754 1.15 mrg 755 1.15 mrg inline __complex__ _Float128 756 1.15 mrg __complex_cosh(__complex__ _Float128 __z) { return __builtin_ccoshl(__z); } 757 1.15 mrg 758 1.15 mrg inline __complex__ _Float128 759 1.15 mrg __complex_exp(__complex__ _Float128 __z) { return __builtin_cexpl(__z); } 760 1.15 mrg 761 1.15 mrg inline __complex__ _Float128 762 1.15 mrg __complex_log(__complex__ _Float128 __z) { return __builtin_clogl(__z); } 763 1.15 mrg 764 1.15 mrg inline __complex__ _Float128 765 1.15 mrg __complex_sin(__complex__ _Float128 __z) { return __builtin_csinl(__z); } 766 1.15 mrg 767 1.15 mrg inline __complex__ _Float128 768 1.15 mrg __complex_sinh(__complex__ _Float128 __z) { return __builtin_csinhl(__z); } 769 1.15 mrg 770 1.15 mrg inline __complex__ _Float128 771 1.15 mrg __complex_sqrt(__complex__ _Float128 __z) { return __builtin_csqrtl(__z); } 772 1.15 mrg 773 1.15 mrg inline __complex__ _Float128 774 1.15 mrg __complex_tan(__complex__ _Float128 __z) { return __builtin_ctanl(__z); } 775 1.15 mrg 776 1.15 mrg inline __complex__ _Float128 777 1.15 mrg __complex_tanh(__complex__ _Float128 __z) { return __builtin_ctanhl(__z); } 778 1.15 mrg 779 1.15 mrg inline __complex__ _Float128 780 1.15 mrg __complex_pow(__complex__ _Float128 __x, __complex__ _Float128 __y) 781 1.15 mrg { return __builtin_cpowl(__x, __y); } 782 1.15 mrg #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH) 783 1.15 mrg inline _Float128 784 1.15 mrg __complex_abs(__complex__ _Float128 __z) { return __builtin_cabsf128(__z); } 785 1.15 mrg 786 1.15 mrg inline _Float128 787 1.15 mrg __complex_arg(__complex__ _Float128 __z) { return __builtin_cargf128(__z); } 788 1.15 mrg 789 1.15 mrg inline __complex__ _Float128 790 1.15 mrg __complex_cos(__complex__ _Float128 __z) { return __builtin_ccosf128(__z); } 791 1.15 mrg 792 1.15 mrg inline __complex__ _Float128 793 1.15 mrg __complex_cosh(__complex__ _Float128 __z) { return __builtin_ccoshf128(__z); } 794 1.15 mrg 795 1.15 mrg inline __complex__ _Float128 796 1.15 mrg __complex_exp(__complex__ _Float128 __z) { return __builtin_cexpf128(__z); } 797 1.15 mrg 798 1.15 mrg inline __complex__ _Float128 799 1.15 mrg __complex_log(__complex__ _Float128 __z) { return __builtin_clogf128(__z); } 800 1.15 mrg 801 1.15 mrg inline __complex__ _Float128 802 1.15 mrg __complex_sin(__complex__ _Float128 __z) { return __builtin_csinf128(__z); } 803 1.15 mrg 804 1.15 mrg inline __complex__ _Float128 805 1.15 mrg __complex_sinh(__complex__ _Float128 __z) { return __builtin_csinhf128(__z); } 806 1.15 mrg 807 1.15 mrg inline __complex__ _Float128 808 1.15 mrg __complex_sqrt(__complex__ _Float128 __z) { return __builtin_csqrtf128(__z); } 809 1.15 mrg 810 1.15 mrg inline __complex__ _Float128 811 1.15 mrg __complex_tan(__complex__ _Float128 __z) { return __builtin_ctanf128(__z); } 812 1.15 mrg 813 1.15 mrg inline __complex__ _Float128 814 1.15 mrg __complex_tanh(__complex__ _Float128 __z) { return __builtin_ctanhf128(__z); } 815 1.15 mrg 816 1.15 mrg inline __complex__ _Float128 817 1.15 mrg __complex_pow(__complex__ _Float128 __x, __complex__ _Float128 __y) 818 1.15 mrg { return __builtin_cpowf128(__x, __y); } 819 1.15 mrg #endif 820 1.15 mrg 821 1.15 mrg #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 822 1.15 mrg inline __gnu_cxx::__bfloat16_t 823 1.15 mrg __complex_abs(__complex__ decltype(0.0bf16) __z) 824 1.15 mrg { return __gnu_cxx::__bfloat16_t(__builtin_cabsf(__z)); } 825 1.15 mrg 826 1.15 mrg inline __gnu_cxx::__bfloat16_t 827 1.15 mrg __complex_arg(__complex__ decltype(0.0bf16) __z) 828 1.15 mrg { return __gnu_cxx::__bfloat16_t(__builtin_cargf(__z)); } 829 1.15 mrg 830 1.15 mrg inline __complex__ decltype(0.0bf16) 831 1.15 mrg __complex_cos(__complex__ decltype(0.0bf16) __z) 832 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ccosf(__z)); } 833 1.15 mrg 834 1.15 mrg inline __complex__ decltype(0.0bf16) 835 1.15 mrg __complex_cosh(__complex__ decltype(0.0bf16) __z) 836 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ccoshf(__z)); } 837 1.15 mrg 838 1.15 mrg inline __complex__ decltype(0.0bf16) 839 1.15 mrg __complex_exp(__complex__ decltype(0.0bf16) __z) 840 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cexpf(__z)); } 841 1.15 mrg 842 1.15 mrg inline __complex__ decltype(0.0bf16) 843 1.15 mrg __complex_log(__complex__ decltype(0.0bf16) __z) 844 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_clogf(__z)); } 845 1.15 mrg 846 1.15 mrg inline __complex__ decltype(0.0bf16) 847 1.15 mrg __complex_sin(__complex__ decltype(0.0bf16) __z) 848 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_csinf(__z)); } 849 1.15 mrg 850 1.15 mrg inline __complex__ decltype(0.0bf16) 851 1.15 mrg __complex_sinh(__complex__ decltype(0.0bf16) __z) 852 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_csinhf(__z)); } 853 1.15 mrg 854 1.15 mrg inline __complex__ decltype(0.0bf16) 855 1.15 mrg __complex_sqrt(__complex__ decltype(0.0bf16) __z) 856 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_csqrtf(__z)); } 857 1.15 mrg 858 1.15 mrg inline __complex__ decltype(0.0bf16) 859 1.15 mrg __complex_tan(__complex__ decltype(0.0bf16) __z) 860 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ctanf(__z)); } 861 1.15 mrg 862 1.15 mrg inline __complex__ decltype(0.0bf16) 863 1.15 mrg __complex_tanh(__complex__ decltype(0.0bf16) __z) 864 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ctanhf(__z)); } 865 1.15 mrg 866 1.15 mrg inline __complex__ decltype(0.0bf16) 867 1.15 mrg __complex_pow(__complex__ decltype(0.0bf16) __x, 868 1.15 mrg __complex__ decltype(0.0bf16) __y) 869 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cpowf(__x, 870 1.15 mrg __y)); } 871 1.15 mrg #endif 872 1.15 mrg #endif 873 1.15 mrg 874 1.1 mrg // 26.2.7/3 abs(__z): Returns the magnitude of __z. 875 1.1 mrg template<typename _Tp> 876 1.1 mrg inline _Tp 877 1.1 mrg __complex_abs(const complex<_Tp>& __z) 878 1.1 mrg { 879 1.1 mrg _Tp __x = __z.real(); 880 1.1 mrg _Tp __y = __z.imag(); 881 1.1 mrg const _Tp __s = std::max(abs(__x), abs(__y)); 882 1.1 mrg if (__s == _Tp()) // well ... 883 1.1 mrg return __s; 884 1.8 mrg __x /= __s; 885 1.1 mrg __y /= __s; 886 1.1 mrg return __s * sqrt(__x * __x + __y * __y); 887 1.1 mrg } 888 1.1 mrg 889 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 890 1.2 christos // XXX: We can't use __builtin_cabs* because they are broken 891 1.1 mrg inline float 892 1.2 christos __complex_abs(__complex__ float __z) { return __c99_cabsf(__z); } 893 1.1 mrg 894 1.1 mrg inline double 895 1.2 christos __complex_abs(__complex__ double __z) { return __c99_cabs(__z); } 896 1.1 mrg 897 1.1 mrg inline long double 898 1.1 mrg __complex_abs(const __complex__ long double& __z) 899 1.2 christos { return __c99_cabsl(__z); } 900 1.1 mrg 901 1.1 mrg template<typename _Tp> 902 1.1 mrg inline _Tp 903 1.1 mrg abs(const complex<_Tp>& __z) { return __complex_abs(__z.__rep()); } 904 1.1 mrg #else 905 1.1 mrg template<typename _Tp> 906 1.1 mrg inline _Tp 907 1.1 mrg abs(const complex<_Tp>& __z) { return __complex_abs(__z); } 908 1.8 mrg #endif 909 1.1 mrg 910 1.1 mrg 911 1.1 mrg // 26.2.7/4: arg(__z): Returns the phase angle of __z. 912 1.1 mrg template<typename _Tp> 913 1.1 mrg inline _Tp 914 1.1 mrg __complex_arg(const complex<_Tp>& __z) 915 1.1 mrg { return atan2(__z.imag(), __z.real()); } 916 1.1 mrg 917 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 918 1.1 mrg inline float 919 1.1 mrg __complex_arg(__complex__ float __z) { return __builtin_cargf(__z); } 920 1.1 mrg 921 1.1 mrg inline double 922 1.1 mrg __complex_arg(__complex__ double __z) { return __builtin_carg(__z); } 923 1.1 mrg 924 1.1 mrg inline long double 925 1.1 mrg __complex_arg(const __complex__ long double& __z) 926 1.1 mrg { return __builtin_cargl(__z); } 927 1.1 mrg 928 1.1 mrg template<typename _Tp> 929 1.1 mrg inline _Tp 930 1.1 mrg arg(const complex<_Tp>& __z) { return __complex_arg(__z.__rep()); } 931 1.1 mrg #else 932 1.1 mrg template<typename _Tp> 933 1.1 mrg inline _Tp 934 1.1 mrg arg(const complex<_Tp>& __z) { return __complex_arg(__z); } 935 1.1 mrg #endif 936 1.1 mrg 937 1.1 mrg // 26.2.7/5: norm(__z) returns the squared magnitude of __z. 938 1.1 mrg // As defined, norm() is -not- a norm is the common mathematical 939 1.4 mrg // sense used in numerics. The helper class _Norm_helper<> tries to 940 1.1 mrg // distinguish between builtin floating point and the rest, so as 941 1.1 mrg // to deliver an answer as close as possible to the real value. 942 1.1 mrg template<bool> 943 1.1 mrg struct _Norm_helper 944 1.1 mrg { 945 1.1 mrg template<typename _Tp> 946 1.10 mrg static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z) 947 1.1 mrg { 948 1.1 mrg const _Tp __x = __z.real(); 949 1.1 mrg const _Tp __y = __z.imag(); 950 1.1 mrg return __x * __x + __y * __y; 951 1.1 mrg } 952 1.1 mrg }; 953 1.1 mrg 954 1.1 mrg template<> 955 1.1 mrg struct _Norm_helper<true> 956 1.1 mrg { 957 1.1 mrg template<typename _Tp> 958 1.10 mrg static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z) 959 1.1 mrg { 960 1.10 mrg //_Tp __res = std::abs(__z); 961 1.10 mrg //return __res * __res; 962 1.10 mrg const _Tp __x = __z.real(); 963 1.10 mrg const _Tp __y = __z.imag(); 964 1.10 mrg return __x * __x + __y * __y; 965 1.1 mrg } 966 1.1 mrg }; 967 1.8 mrg 968 1.1 mrg template<typename _Tp> 969 1.10 mrg inline _GLIBCXX20_CONSTEXPR _Tp 970 1.1 mrg norm(const complex<_Tp>& __z) 971 1.1 mrg { 972 1.8 mrg return _Norm_helper<__is_floating<_Tp>::__value 973 1.1 mrg && !_GLIBCXX_FAST_MATH>::_S_do_it(__z); 974 1.1 mrg } 975 1.1 mrg 976 1.1 mrg template<typename _Tp> 977 1.1 mrg inline complex<_Tp> 978 1.1 mrg polar(const _Tp& __rho, const _Tp& __theta) 979 1.6 mrg { 980 1.6 mrg __glibcxx_assert( __rho >= 0 ); 981 1.6 mrg return complex<_Tp>(__rho * cos(__theta), __rho * sin(__theta)); 982 1.6 mrg } 983 1.1 mrg 984 1.1 mrg template<typename _Tp> 985 1.10 mrg inline _GLIBCXX20_CONSTEXPR complex<_Tp> 986 1.1 mrg conj(const complex<_Tp>& __z) 987 1.1 mrg { return complex<_Tp>(__z.real(), -__z.imag()); } 988 1.8 mrg 989 1.1 mrg // Transcendentals 990 1.1 mrg 991 1.1 mrg // 26.2.8/1 cos(__z): Returns the cosine of __z. 992 1.1 mrg template<typename _Tp> 993 1.1 mrg inline complex<_Tp> 994 1.1 mrg __complex_cos(const complex<_Tp>& __z) 995 1.1 mrg { 996 1.1 mrg const _Tp __x = __z.real(); 997 1.1 mrg const _Tp __y = __z.imag(); 998 1.1 mrg return complex<_Tp>(cos(__x) * cosh(__y), -sin(__x) * sinh(__y)); 999 1.1 mrg } 1000 1.1 mrg 1001 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1002 1.1 mrg inline __complex__ float 1003 1.1 mrg __complex_cos(__complex__ float __z) { return __builtin_ccosf(__z); } 1004 1.1 mrg 1005 1.1 mrg inline __complex__ double 1006 1.1 mrg __complex_cos(__complex__ double __z) { return __builtin_ccos(__z); } 1007 1.1 mrg 1008 1.1 mrg inline __complex__ long double 1009 1.1 mrg __complex_cos(const __complex__ long double& __z) 1010 1.1 mrg { return __builtin_ccosl(__z); } 1011 1.1 mrg 1012 1.1 mrg template<typename _Tp> 1013 1.1 mrg inline complex<_Tp> 1014 1.1 mrg cos(const complex<_Tp>& __z) { return __complex_cos(__z.__rep()); } 1015 1.1 mrg #else 1016 1.1 mrg template<typename _Tp> 1017 1.1 mrg inline complex<_Tp> 1018 1.1 mrg cos(const complex<_Tp>& __z) { return __complex_cos(__z); } 1019 1.1 mrg #endif 1020 1.1 mrg 1021 1.1 mrg // 26.2.8/2 cosh(__z): Returns the hyperbolic cosine of __z. 1022 1.1 mrg template<typename _Tp> 1023 1.1 mrg inline complex<_Tp> 1024 1.1 mrg __complex_cosh(const complex<_Tp>& __z) 1025 1.1 mrg { 1026 1.1 mrg const _Tp __x = __z.real(); 1027 1.1 mrg const _Tp __y = __z.imag(); 1028 1.1 mrg return complex<_Tp>(cosh(__x) * cos(__y), sinh(__x) * sin(__y)); 1029 1.1 mrg } 1030 1.1 mrg 1031 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1032 1.1 mrg inline __complex__ float 1033 1.1 mrg __complex_cosh(__complex__ float __z) { return __builtin_ccoshf(__z); } 1034 1.1 mrg 1035 1.1 mrg inline __complex__ double 1036 1.1 mrg __complex_cosh(__complex__ double __z) { return __builtin_ccosh(__z); } 1037 1.1 mrg 1038 1.1 mrg inline __complex__ long double 1039 1.1 mrg __complex_cosh(const __complex__ long double& __z) 1040 1.1 mrg { return __builtin_ccoshl(__z); } 1041 1.1 mrg 1042 1.1 mrg template<typename _Tp> 1043 1.1 mrg inline complex<_Tp> 1044 1.1 mrg cosh(const complex<_Tp>& __z) { return __complex_cosh(__z.__rep()); } 1045 1.1 mrg #else 1046 1.1 mrg template<typename _Tp> 1047 1.1 mrg inline complex<_Tp> 1048 1.1 mrg cosh(const complex<_Tp>& __z) { return __complex_cosh(__z); } 1049 1.1 mrg #endif 1050 1.1 mrg 1051 1.1 mrg // 26.2.8/3 exp(__z): Returns the complex base e exponential of x 1052 1.1 mrg template<typename _Tp> 1053 1.1 mrg inline complex<_Tp> 1054 1.1 mrg __complex_exp(const complex<_Tp>& __z) 1055 1.4 mrg { return std::polar<_Tp>(exp(__z.real()), __z.imag()); } 1056 1.1 mrg 1057 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1058 1.1 mrg inline __complex__ float 1059 1.1 mrg __complex_exp(__complex__ float __z) { return __builtin_cexpf(__z); } 1060 1.1 mrg 1061 1.1 mrg inline __complex__ double 1062 1.1 mrg __complex_exp(__complex__ double __z) { return __builtin_cexp(__z); } 1063 1.1 mrg 1064 1.1 mrg inline __complex__ long double 1065 1.1 mrg __complex_exp(const __complex__ long double& __z) 1066 1.1 mrg { return __builtin_cexpl(__z); } 1067 1.1 mrg 1068 1.1 mrg template<typename _Tp> 1069 1.1 mrg inline complex<_Tp> 1070 1.1 mrg exp(const complex<_Tp>& __z) { return __complex_exp(__z.__rep()); } 1071 1.1 mrg #else 1072 1.1 mrg template<typename _Tp> 1073 1.1 mrg inline complex<_Tp> 1074 1.1 mrg exp(const complex<_Tp>& __z) { return __complex_exp(__z); } 1075 1.1 mrg #endif 1076 1.1 mrg 1077 1.1 mrg // 26.2.8/5 log(__z): Returns the natural complex logarithm of __z. 1078 1.1 mrg // The branch cut is along the negative axis. 1079 1.1 mrg template<typename _Tp> 1080 1.1 mrg inline complex<_Tp> 1081 1.1 mrg __complex_log(const complex<_Tp>& __z) 1082 1.1 mrg { return complex<_Tp>(log(std::abs(__z)), std::arg(__z)); } 1083 1.1 mrg 1084 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1085 1.1 mrg inline __complex__ float 1086 1.1 mrg __complex_log(__complex__ float __z) { return __builtin_clogf(__z); } 1087 1.1 mrg 1088 1.1 mrg inline __complex__ double 1089 1.1 mrg __complex_log(__complex__ double __z) { return __builtin_clog(__z); } 1090 1.1 mrg 1091 1.1 mrg inline __complex__ long double 1092 1.1 mrg __complex_log(const __complex__ long double& __z) 1093 1.1 mrg { return __builtin_clogl(__z); } 1094 1.1 mrg 1095 1.1 mrg template<typename _Tp> 1096 1.1 mrg inline complex<_Tp> 1097 1.1 mrg log(const complex<_Tp>& __z) { return __complex_log(__z.__rep()); } 1098 1.1 mrg #else 1099 1.1 mrg template<typename _Tp> 1100 1.1 mrg inline complex<_Tp> 1101 1.1 mrg log(const complex<_Tp>& __z) { return __complex_log(__z); } 1102 1.1 mrg #endif 1103 1.1 mrg 1104 1.1 mrg template<typename _Tp> 1105 1.1 mrg inline complex<_Tp> 1106 1.1 mrg log10(const complex<_Tp>& __z) 1107 1.1 mrg { return std::log(__z) / log(_Tp(10.0)); } 1108 1.1 mrg 1109 1.1 mrg // 26.2.8/10 sin(__z): Returns the sine of __z. 1110 1.1 mrg template<typename _Tp> 1111 1.1 mrg inline complex<_Tp> 1112 1.1 mrg __complex_sin(const complex<_Tp>& __z) 1113 1.1 mrg { 1114 1.1 mrg const _Tp __x = __z.real(); 1115 1.1 mrg const _Tp __y = __z.imag(); 1116 1.8 mrg return complex<_Tp>(sin(__x) * cosh(__y), cos(__x) * sinh(__y)); 1117 1.1 mrg } 1118 1.1 mrg 1119 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1120 1.1 mrg inline __complex__ float 1121 1.1 mrg __complex_sin(__complex__ float __z) { return __builtin_csinf(__z); } 1122 1.1 mrg 1123 1.1 mrg inline __complex__ double 1124 1.1 mrg __complex_sin(__complex__ double __z) { return __builtin_csin(__z); } 1125 1.1 mrg 1126 1.1 mrg inline __complex__ long double 1127 1.1 mrg __complex_sin(const __complex__ long double& __z) 1128 1.1 mrg { return __builtin_csinl(__z); } 1129 1.1 mrg 1130 1.1 mrg template<typename _Tp> 1131 1.1 mrg inline complex<_Tp> 1132 1.1 mrg sin(const complex<_Tp>& __z) { return __complex_sin(__z.__rep()); } 1133 1.1 mrg #else 1134 1.1 mrg template<typename _Tp> 1135 1.1 mrg inline complex<_Tp> 1136 1.1 mrg sin(const complex<_Tp>& __z) { return __complex_sin(__z); } 1137 1.1 mrg #endif 1138 1.1 mrg 1139 1.1 mrg // 26.2.8/11 sinh(__z): Returns the hyperbolic sine of __z. 1140 1.1 mrg template<typename _Tp> 1141 1.1 mrg inline complex<_Tp> 1142 1.1 mrg __complex_sinh(const complex<_Tp>& __z) 1143 1.1 mrg { 1144 1.1 mrg const _Tp __x = __z.real(); 1145 1.1 mrg const _Tp __y = __z.imag(); 1146 1.1 mrg return complex<_Tp>(sinh(__x) * cos(__y), cosh(__x) * sin(__y)); 1147 1.1 mrg } 1148 1.1 mrg 1149 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1150 1.1 mrg inline __complex__ float 1151 1.8 mrg __complex_sinh(__complex__ float __z) { return __builtin_csinhf(__z); } 1152 1.1 mrg 1153 1.1 mrg inline __complex__ double 1154 1.8 mrg __complex_sinh(__complex__ double __z) { return __builtin_csinh(__z); } 1155 1.1 mrg 1156 1.1 mrg inline __complex__ long double 1157 1.1 mrg __complex_sinh(const __complex__ long double& __z) 1158 1.8 mrg { return __builtin_csinhl(__z); } 1159 1.1 mrg 1160 1.1 mrg template<typename _Tp> 1161 1.1 mrg inline complex<_Tp> 1162 1.1 mrg sinh(const complex<_Tp>& __z) { return __complex_sinh(__z.__rep()); } 1163 1.1 mrg #else 1164 1.1 mrg template<typename _Tp> 1165 1.1 mrg inline complex<_Tp> 1166 1.1 mrg sinh(const complex<_Tp>& __z) { return __complex_sinh(__z); } 1167 1.1 mrg #endif 1168 1.1 mrg 1169 1.1 mrg // 26.2.8/13 sqrt(__z): Returns the complex square root of __z. 1170 1.1 mrg // The branch cut is on the negative axis. 1171 1.1 mrg template<typename _Tp> 1172 1.1 mrg complex<_Tp> 1173 1.1 mrg __complex_sqrt(const complex<_Tp>& __z) 1174 1.1 mrg { 1175 1.1 mrg _Tp __x = __z.real(); 1176 1.1 mrg _Tp __y = __z.imag(); 1177 1.1 mrg 1178 1.1 mrg if (__x == _Tp()) 1179 1.1 mrg { 1180 1.1 mrg _Tp __t = sqrt(abs(__y) / 2); 1181 1.1 mrg return complex<_Tp>(__t, __y < _Tp() ? -__t : __t); 1182 1.1 mrg } 1183 1.1 mrg else 1184 1.1 mrg { 1185 1.1 mrg _Tp __t = sqrt(2 * (std::abs(__z) + abs(__x))); 1186 1.1 mrg _Tp __u = __t / 2; 1187 1.1 mrg return __x > _Tp() 1188 1.1 mrg ? complex<_Tp>(__u, __y / __t) 1189 1.1 mrg : complex<_Tp>(abs(__y) / __t, __y < _Tp() ? -__u : __u); 1190 1.1 mrg } 1191 1.1 mrg } 1192 1.1 mrg 1193 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1194 1.1 mrg inline __complex__ float 1195 1.1 mrg __complex_sqrt(__complex__ float __z) { return __builtin_csqrtf(__z); } 1196 1.1 mrg 1197 1.1 mrg inline __complex__ double 1198 1.1 mrg __complex_sqrt(__complex__ double __z) { return __builtin_csqrt(__z); } 1199 1.1 mrg 1200 1.1 mrg inline __complex__ long double 1201 1.1 mrg __complex_sqrt(const __complex__ long double& __z) 1202 1.1 mrg { return __builtin_csqrtl(__z); } 1203 1.1 mrg 1204 1.1 mrg template<typename _Tp> 1205 1.1 mrg inline complex<_Tp> 1206 1.1 mrg sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z.__rep()); } 1207 1.1 mrg #else 1208 1.1 mrg template<typename _Tp> 1209 1.1 mrg inline complex<_Tp> 1210 1.1 mrg sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z); } 1211 1.1 mrg #endif 1212 1.1 mrg 1213 1.1 mrg // 26.2.8/14 tan(__z): Return the complex tangent of __z. 1214 1.8 mrg 1215 1.1 mrg template<typename _Tp> 1216 1.1 mrg inline complex<_Tp> 1217 1.1 mrg __complex_tan(const complex<_Tp>& __z) 1218 1.1 mrg { return std::sin(__z) / std::cos(__z); } 1219 1.1 mrg 1220 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1221 1.1 mrg inline __complex__ float 1222 1.1 mrg __complex_tan(__complex__ float __z) { return __builtin_ctanf(__z); } 1223 1.1 mrg 1224 1.1 mrg inline __complex__ double 1225 1.1 mrg __complex_tan(__complex__ double __z) { return __builtin_ctan(__z); } 1226 1.1 mrg 1227 1.1 mrg inline __complex__ long double 1228 1.1 mrg __complex_tan(const __complex__ long double& __z) 1229 1.1 mrg { return __builtin_ctanl(__z); } 1230 1.1 mrg 1231 1.1 mrg template<typename _Tp> 1232 1.1 mrg inline complex<_Tp> 1233 1.1 mrg tan(const complex<_Tp>& __z) { return __complex_tan(__z.__rep()); } 1234 1.1 mrg #else 1235 1.1 mrg template<typename _Tp> 1236 1.1 mrg inline complex<_Tp> 1237 1.1 mrg tan(const complex<_Tp>& __z) { return __complex_tan(__z); } 1238 1.1 mrg #endif 1239 1.1 mrg 1240 1.1 mrg 1241 1.1 mrg // 26.2.8/15 tanh(__z): Returns the hyperbolic tangent of __z. 1242 1.8 mrg 1243 1.1 mrg template<typename _Tp> 1244 1.1 mrg inline complex<_Tp> 1245 1.1 mrg __complex_tanh(const complex<_Tp>& __z) 1246 1.1 mrg { return std::sinh(__z) / std::cosh(__z); } 1247 1.1 mrg 1248 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1249 1.1 mrg inline __complex__ float 1250 1.1 mrg __complex_tanh(__complex__ float __z) { return __builtin_ctanhf(__z); } 1251 1.1 mrg 1252 1.1 mrg inline __complex__ double 1253 1.1 mrg __complex_tanh(__complex__ double __z) { return __builtin_ctanh(__z); } 1254 1.1 mrg 1255 1.1 mrg inline __complex__ long double 1256 1.1 mrg __complex_tanh(const __complex__ long double& __z) 1257 1.1 mrg { return __builtin_ctanhl(__z); } 1258 1.1 mrg 1259 1.1 mrg template<typename _Tp> 1260 1.1 mrg inline complex<_Tp> 1261 1.1 mrg tanh(const complex<_Tp>& __z) { return __complex_tanh(__z.__rep()); } 1262 1.1 mrg #else 1263 1.1 mrg template<typename _Tp> 1264 1.1 mrg inline complex<_Tp> 1265 1.1 mrg tanh(const complex<_Tp>& __z) { return __complex_tanh(__z); } 1266 1.1 mrg #endif 1267 1.1 mrg 1268 1.1 mrg 1269 1.1 mrg // 26.2.8/9 pow(__x, __y): Returns the complex power base of __x 1270 1.1 mrg // raised to the __y-th power. The branch 1271 1.1 mrg // cut is on the negative axis. 1272 1.2 christos template<typename _Tp> 1273 1.2 christos complex<_Tp> 1274 1.2 christos __complex_pow_unsigned(complex<_Tp> __x, unsigned __n) 1275 1.2 christos { 1276 1.2 christos complex<_Tp> __y = __n % 2 ? __x : complex<_Tp>(1); 1277 1.2 christos 1278 1.2 christos while (__n >>= 1) 1279 1.2 christos { 1280 1.2 christos __x *= __x; 1281 1.2 christos if (__n % 2) 1282 1.2 christos __y *= __x; 1283 1.2 christos } 1284 1.2 christos 1285 1.2 christos return __y; 1286 1.2 christos } 1287 1.2 christos 1288 1.4 mrg // In C++11 mode we used to implement the resolution of 1289 1.1 mrg // DR 844. complex pow return type is ambiguous. 1290 1.4 mrg // thus the following overload was disabled in that mode. However, doing 1291 1.4 mrg // that causes all sorts of issues, see, for example: 1292 1.4 mrg // http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html 1293 1.4 mrg // and also PR57974. 1294 1.1 mrg template<typename _Tp> 1295 1.1 mrg inline complex<_Tp> 1296 1.1 mrg pow(const complex<_Tp>& __z, int __n) 1297 1.2 christos { 1298 1.2 christos return __n < 0 1299 1.2 christos ? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n) 1300 1.2 christos : std::__complex_pow_unsigned(__z, __n); 1301 1.2 christos } 1302 1.1 mrg 1303 1.1 mrg template<typename _Tp> 1304 1.1 mrg complex<_Tp> 1305 1.1 mrg pow(const complex<_Tp>& __x, const _Tp& __y) 1306 1.1 mrg { 1307 1.6 mrg #if ! _GLIBCXX_USE_C99_COMPLEX 1308 1.1 mrg if (__x == _Tp()) 1309 1.1 mrg return _Tp(); 1310 1.1 mrg #endif 1311 1.1 mrg if (__x.imag() == _Tp() && __x.real() > _Tp()) 1312 1.1 mrg return pow(__x.real(), __y); 1313 1.1 mrg 1314 1.1 mrg complex<_Tp> __t = std::log(__x); 1315 1.4 mrg return std::polar<_Tp>(exp(__y * __t.real()), __y * __t.imag()); 1316 1.1 mrg } 1317 1.1 mrg 1318 1.1 mrg template<typename _Tp> 1319 1.1 mrg inline complex<_Tp> 1320 1.1 mrg __complex_pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1321 1.1 mrg { return __x == _Tp() ? _Tp() : std::exp(__y * std::log(__x)); } 1322 1.1 mrg 1323 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 1324 1.1 mrg inline __complex__ float 1325 1.1 mrg __complex_pow(__complex__ float __x, __complex__ float __y) 1326 1.1 mrg { return __builtin_cpowf(__x, __y); } 1327 1.1 mrg 1328 1.1 mrg inline __complex__ double 1329 1.1 mrg __complex_pow(__complex__ double __x, __complex__ double __y) 1330 1.1 mrg { return __builtin_cpow(__x, __y); } 1331 1.1 mrg 1332 1.1 mrg inline __complex__ long double 1333 1.1 mrg __complex_pow(const __complex__ long double& __x, 1334 1.1 mrg const __complex__ long double& __y) 1335 1.1 mrg { return __builtin_cpowl(__x, __y); } 1336 1.1 mrg 1337 1.1 mrg template<typename _Tp> 1338 1.1 mrg inline complex<_Tp> 1339 1.1 mrg pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1340 1.1 mrg { return __complex_pow(__x.__rep(), __y.__rep()); } 1341 1.1 mrg #else 1342 1.1 mrg template<typename _Tp> 1343 1.1 mrg inline complex<_Tp> 1344 1.1 mrg pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1345 1.1 mrg { return __complex_pow(__x, __y); } 1346 1.1 mrg #endif 1347 1.1 mrg 1348 1.1 mrg template<typename _Tp> 1349 1.1 mrg inline complex<_Tp> 1350 1.1 mrg pow(const _Tp& __x, const complex<_Tp>& __y) 1351 1.1 mrg { 1352 1.4 mrg return __x > _Tp() ? std::polar<_Tp>(pow(__x, __y.real()), 1353 1.4 mrg __y.imag() * log(__x)) 1354 1.1 mrg : std::pow(complex<_Tp>(__x), __y); 1355 1.1 mrg } 1356 1.1 mrg 1357 1.2 christos /// 26.2.3 complex specializations 1358 1.2 christos /// complex<float> specialization 1359 1.1 mrg template<> 1360 1.13 mrg class complex<float> 1361 1.1 mrg { 1362 1.13 mrg public: 1363 1.1 mrg typedef float value_type; 1364 1.1 mrg typedef __complex__ float _ComplexT; 1365 1.1 mrg 1366 1.2 christos _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { } 1367 1.1 mrg 1368 1.2 christos _GLIBCXX_CONSTEXPR complex(float __r = 0.0f, float __i = 0.0f) 1369 1.2 christos #if __cplusplus >= 201103L 1370 1.2 christos : _M_value{ __r, __i } { } 1371 1.2 christos #else 1372 1.1 mrg { 1373 1.1 mrg __real__ _M_value = __r; 1374 1.1 mrg __imag__ _M_value = __i; 1375 1.1 mrg } 1376 1.2 christos #endif 1377 1.1 mrg 1378 1.14 mrg #if __cplusplus >= 201103L 1379 1.14 mrg _GLIBCXX14_CONSTEXPR complex(const complex&) = default; 1380 1.14 mrg #endif 1381 1.14 mrg 1382 1.15 mrg #if __cplusplus > 202002L 1383 1.15 mrg template<typename _Up> 1384 1.15 mrg explicit(!requires(_Up __u) { value_type{__u}; }) 1385 1.15 mrg constexpr complex(const complex<_Up>& __z) 1386 1.15 mrg : _M_value{ value_type(__z.real()), value_type(__z.imag()) } { } 1387 1.15 mrg #else 1388 1.2 christos explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&); 1389 1.8 mrg explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&); 1390 1.15 mrg #endif 1391 1.1 mrg 1392 1.2 christos #if __cplusplus >= 201103L 1393 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1394 1.1 mrg // DR 387. std::complex over-encapsulated. 1395 1.2 christos __attribute ((__abi_tag__ ("cxx11"))) 1396 1.8 mrg constexpr float 1397 1.4 mrg real() const { return __real__ _M_value; } 1398 1.2 christos 1399 1.2 christos __attribute ((__abi_tag__ ("cxx11"))) 1400 1.8 mrg constexpr float 1401 1.4 mrg imag() const { return __imag__ _M_value; } 1402 1.1 mrg #else 1403 1.8 mrg float& 1404 1.2 christos real() { return __real__ _M_value; } 1405 1.1 mrg 1406 1.8 mrg const float& 1407 1.8 mrg real() const { return __real__ _M_value; } 1408 1.1 mrg 1409 1.8 mrg float& 1410 1.2 christos imag() { return __imag__ _M_value; } 1411 1.1 mrg 1412 1.8 mrg const float& 1413 1.2 christos imag() const { return __imag__ _M_value; } 1414 1.1 mrg #endif 1415 1.1 mrg 1416 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1417 1.1 mrg // DR 387. std::complex over-encapsulated. 1418 1.10 mrg _GLIBCXX20_CONSTEXPR void 1419 1.2 christos real(float __val) { __real__ _M_value = __val; } 1420 1.1 mrg 1421 1.10 mrg _GLIBCXX20_CONSTEXPR void 1422 1.2 christos imag(float __val) { __imag__ _M_value = __val; } 1423 1.1 mrg 1424 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1425 1.1 mrg operator=(float __f) 1426 1.1 mrg { 1427 1.2 christos _M_value = __f; 1428 1.1 mrg return *this; 1429 1.1 mrg } 1430 1.1 mrg 1431 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1432 1.1 mrg operator+=(float __f) 1433 1.1 mrg { 1434 1.2 christos _M_value += __f; 1435 1.1 mrg return *this; 1436 1.1 mrg } 1437 1.1 mrg 1438 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1439 1.1 mrg operator-=(float __f) 1440 1.1 mrg { 1441 1.2 christos _M_value -= __f; 1442 1.1 mrg return *this; 1443 1.1 mrg } 1444 1.1 mrg 1445 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1446 1.1 mrg operator*=(float __f) 1447 1.1 mrg { 1448 1.1 mrg _M_value *= __f; 1449 1.1 mrg return *this; 1450 1.1 mrg } 1451 1.1 mrg 1452 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1453 1.1 mrg operator/=(float __f) 1454 1.1 mrg { 1455 1.1 mrg _M_value /= __f; 1456 1.1 mrg return *this; 1457 1.1 mrg } 1458 1.1 mrg 1459 1.1 mrg // Let the compiler synthesize the copy and assignment 1460 1.1 mrg // operator. It always does a pretty good job. 1461 1.10 mrg #if __cplusplus >= 201103L 1462 1.10 mrg _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default; 1463 1.10 mrg #endif 1464 1.1 mrg 1465 1.1 mrg template<typename _Tp> 1466 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1467 1.1 mrg operator=(const complex<_Tp>& __z) 1468 1.1 mrg { 1469 1.1 mrg __real__ _M_value = __z.real(); 1470 1.1 mrg __imag__ _M_value = __z.imag(); 1471 1.1 mrg return *this; 1472 1.1 mrg } 1473 1.1 mrg 1474 1.1 mrg template<typename _Tp> 1475 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1476 1.1 mrg operator+=(const complex<_Tp>& __z) 1477 1.1 mrg { 1478 1.10 mrg _M_value += __z.__rep(); 1479 1.1 mrg return *this; 1480 1.1 mrg } 1481 1.1 mrg 1482 1.1 mrg template<class _Tp> 1483 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1484 1.1 mrg operator-=(const complex<_Tp>& __z) 1485 1.1 mrg { 1486 1.10 mrg _M_value -= __z.__rep(); 1487 1.1 mrg return *this; 1488 1.1 mrg } 1489 1.1 mrg 1490 1.1 mrg template<class _Tp> 1491 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1492 1.1 mrg operator*=(const complex<_Tp>& __z) 1493 1.1 mrg { 1494 1.10 mrg const _ComplexT __t = __z.__rep(); 1495 1.1 mrg _M_value *= __t; 1496 1.1 mrg return *this; 1497 1.1 mrg } 1498 1.1 mrg 1499 1.1 mrg template<class _Tp> 1500 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1501 1.1 mrg operator/=(const complex<_Tp>& __z) 1502 1.1 mrg { 1503 1.10 mrg const _ComplexT __t = __z.__rep(); 1504 1.1 mrg _M_value /= __t; 1505 1.1 mrg return *this; 1506 1.1 mrg } 1507 1.1 mrg 1508 1.4 mrg _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; } 1509 1.1 mrg 1510 1.1 mrg private: 1511 1.1 mrg _ComplexT _M_value; 1512 1.1 mrg }; 1513 1.1 mrg 1514 1.2 christos /// 26.2.3 complex specializations 1515 1.2 christos /// complex<double> specialization 1516 1.1 mrg template<> 1517 1.13 mrg class complex<double> 1518 1.1 mrg { 1519 1.13 mrg public: 1520 1.1 mrg typedef double value_type; 1521 1.1 mrg typedef __complex__ double _ComplexT; 1522 1.1 mrg 1523 1.2 christos _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { } 1524 1.1 mrg 1525 1.2 christos _GLIBCXX_CONSTEXPR complex(double __r = 0.0, double __i = 0.0) 1526 1.2 christos #if __cplusplus >= 201103L 1527 1.2 christos : _M_value{ __r, __i } { } 1528 1.2 christos #else 1529 1.1 mrg { 1530 1.1 mrg __real__ _M_value = __r; 1531 1.1 mrg __imag__ _M_value = __i; 1532 1.1 mrg } 1533 1.2 christos #endif 1534 1.1 mrg 1535 1.14 mrg #if __cplusplus >= 201103L 1536 1.14 mrg _GLIBCXX14_CONSTEXPR complex(const complex&) = default; 1537 1.14 mrg #endif 1538 1.14 mrg 1539 1.15 mrg #if __cplusplus > 202002L 1540 1.15 mrg template<typename _Up> 1541 1.15 mrg explicit(!requires(_Up __u) { value_type{__u}; }) 1542 1.15 mrg constexpr complex(const complex<_Up>& __z) 1543 1.15 mrg : _M_value{ value_type(__z.real()), value_type(__z.imag()) } { } 1544 1.15 mrg #else 1545 1.2 christos _GLIBCXX_CONSTEXPR complex(const complex<float>& __z) 1546 1.1 mrg : _M_value(__z.__rep()) { } 1547 1.1 mrg 1548 1.8 mrg explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&); 1549 1.15 mrg #endif 1550 1.1 mrg 1551 1.2 christos #if __cplusplus >= 201103L 1552 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1553 1.1 mrg // DR 387. std::complex over-encapsulated. 1554 1.2 christos __attribute ((__abi_tag__ ("cxx11"))) 1555 1.8 mrg constexpr double 1556 1.4 mrg real() const { return __real__ _M_value; } 1557 1.2 christos 1558 1.2 christos __attribute ((__abi_tag__ ("cxx11"))) 1559 1.8 mrg constexpr double 1560 1.4 mrg imag() const { return __imag__ _M_value; } 1561 1.1 mrg #else 1562 1.8 mrg double& 1563 1.2 christos real() { return __real__ _M_value; } 1564 1.1 mrg 1565 1.8 mrg const double& 1566 1.2 christos real() const { return __real__ _M_value; } 1567 1.1 mrg 1568 1.8 mrg double& 1569 1.2 christos imag() { return __imag__ _M_value; } 1570 1.1 mrg 1571 1.8 mrg const double& 1572 1.2 christos imag() const { return __imag__ _M_value; } 1573 1.1 mrg #endif 1574 1.1 mrg 1575 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1576 1.1 mrg // DR 387. std::complex over-encapsulated. 1577 1.10 mrg _GLIBCXX20_CONSTEXPR void 1578 1.2 christos real(double __val) { __real__ _M_value = __val; } 1579 1.1 mrg 1580 1.10 mrg _GLIBCXX20_CONSTEXPR void 1581 1.2 christos imag(double __val) { __imag__ _M_value = __val; } 1582 1.1 mrg 1583 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1584 1.1 mrg operator=(double __d) 1585 1.1 mrg { 1586 1.2 christos _M_value = __d; 1587 1.1 mrg return *this; 1588 1.1 mrg } 1589 1.1 mrg 1590 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1591 1.1 mrg operator+=(double __d) 1592 1.1 mrg { 1593 1.2 christos _M_value += __d; 1594 1.1 mrg return *this; 1595 1.1 mrg } 1596 1.8 mrg 1597 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1598 1.1 mrg operator-=(double __d) 1599 1.1 mrg { 1600 1.2 christos _M_value -= __d; 1601 1.1 mrg return *this; 1602 1.1 mrg } 1603 1.1 mrg 1604 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1605 1.1 mrg operator*=(double __d) 1606 1.1 mrg { 1607 1.1 mrg _M_value *= __d; 1608 1.1 mrg return *this; 1609 1.1 mrg } 1610 1.1 mrg 1611 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1612 1.1 mrg operator/=(double __d) 1613 1.1 mrg { 1614 1.1 mrg _M_value /= __d; 1615 1.1 mrg return *this; 1616 1.1 mrg } 1617 1.1 mrg 1618 1.1 mrg // The compiler will synthesize this, efficiently. 1619 1.10 mrg #if __cplusplus >= 201103L 1620 1.10 mrg _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default; 1621 1.10 mrg #endif 1622 1.1 mrg 1623 1.1 mrg template<typename _Tp> 1624 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1625 1.1 mrg operator=(const complex<_Tp>& __z) 1626 1.1 mrg { 1627 1.10 mrg _M_value = __z.__rep(); 1628 1.1 mrg return *this; 1629 1.1 mrg } 1630 1.1 mrg 1631 1.1 mrg template<typename _Tp> 1632 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1633 1.1 mrg operator+=(const complex<_Tp>& __z) 1634 1.1 mrg { 1635 1.10 mrg _M_value += __z.__rep(); 1636 1.1 mrg return *this; 1637 1.1 mrg } 1638 1.1 mrg 1639 1.1 mrg template<typename _Tp> 1640 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1641 1.1 mrg operator-=(const complex<_Tp>& __z) 1642 1.1 mrg { 1643 1.10 mrg _M_value -= __z.__rep(); 1644 1.1 mrg return *this; 1645 1.1 mrg } 1646 1.1 mrg 1647 1.1 mrg template<typename _Tp> 1648 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1649 1.1 mrg operator*=(const complex<_Tp>& __z) 1650 1.1 mrg { 1651 1.10 mrg const _ComplexT __t = __z.__rep(); 1652 1.1 mrg _M_value *= __t; 1653 1.1 mrg return *this; 1654 1.1 mrg } 1655 1.1 mrg 1656 1.1 mrg template<typename _Tp> 1657 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1658 1.1 mrg operator/=(const complex<_Tp>& __z) 1659 1.1 mrg { 1660 1.10 mrg const _ComplexT __t = __z.__rep(); 1661 1.1 mrg _M_value /= __t; 1662 1.1 mrg return *this; 1663 1.1 mrg } 1664 1.1 mrg 1665 1.4 mrg _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; } 1666 1.1 mrg 1667 1.1 mrg private: 1668 1.1 mrg _ComplexT _M_value; 1669 1.1 mrg }; 1670 1.1 mrg 1671 1.2 christos /// 26.2.3 complex specializations 1672 1.2 christos /// complex<long double> specialization 1673 1.1 mrg template<> 1674 1.13 mrg class complex<long double> 1675 1.1 mrg { 1676 1.13 mrg public: 1677 1.1 mrg typedef long double value_type; 1678 1.1 mrg typedef __complex__ long double _ComplexT; 1679 1.1 mrg 1680 1.2 christos _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { } 1681 1.1 mrg 1682 1.8 mrg _GLIBCXX_CONSTEXPR complex(long double __r = 0.0L, 1683 1.2 christos long double __i = 0.0L) 1684 1.2 christos #if __cplusplus >= 201103L 1685 1.2 christos : _M_value{ __r, __i } { } 1686 1.2 christos #else 1687 1.1 mrg { 1688 1.1 mrg __real__ _M_value = __r; 1689 1.1 mrg __imag__ _M_value = __i; 1690 1.1 mrg } 1691 1.2 christos #endif 1692 1.1 mrg 1693 1.14 mrg #if __cplusplus >= 201103L 1694 1.14 mrg _GLIBCXX14_CONSTEXPR complex(const complex&) = default; 1695 1.14 mrg #endif 1696 1.14 mrg 1697 1.15 mrg #if __cplusplus > 202002L 1698 1.15 mrg template<typename _Up> 1699 1.15 mrg explicit(!requires(_Up __u) { value_type{__u}; }) 1700 1.15 mrg constexpr complex(const complex<_Up>& __z) 1701 1.15 mrg : _M_value{ value_type(__z.real()), value_type(__z.imag()) } { } 1702 1.15 mrg #else 1703 1.2 christos _GLIBCXX_CONSTEXPR complex(const complex<float>& __z) 1704 1.1 mrg : _M_value(__z.__rep()) { } 1705 1.1 mrg 1706 1.2 christos _GLIBCXX_CONSTEXPR complex(const complex<double>& __z) 1707 1.1 mrg : _M_value(__z.__rep()) { } 1708 1.15 mrg #endif 1709 1.1 mrg 1710 1.2 christos #if __cplusplus >= 201103L 1711 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1712 1.1 mrg // DR 387. std::complex over-encapsulated. 1713 1.2 christos __attribute ((__abi_tag__ ("cxx11"))) 1714 1.8 mrg constexpr long double 1715 1.4 mrg real() const { return __real__ _M_value; } 1716 1.2 christos 1717 1.2 christos __attribute ((__abi_tag__ ("cxx11"))) 1718 1.8 mrg constexpr long double 1719 1.4 mrg imag() const { return __imag__ _M_value; } 1720 1.1 mrg #else 1721 1.8 mrg long double& 1722 1.2 christos real() { return __real__ _M_value; } 1723 1.1 mrg 1724 1.8 mrg const long double& 1725 1.2 christos real() const { return __real__ _M_value; } 1726 1.1 mrg 1727 1.8 mrg long double& 1728 1.2 christos imag() { return __imag__ _M_value; } 1729 1.1 mrg 1730 1.8 mrg const long double& 1731 1.2 christos imag() const { return __imag__ _M_value; } 1732 1.1 mrg #endif 1733 1.1 mrg 1734 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1735 1.1 mrg // DR 387. std::complex over-encapsulated. 1736 1.10 mrg _GLIBCXX20_CONSTEXPR void 1737 1.2 christos real(long double __val) { __real__ _M_value = __val; } 1738 1.1 mrg 1739 1.10 mrg _GLIBCXX20_CONSTEXPR void 1740 1.2 christos imag(long double __val) { __imag__ _M_value = __val; } 1741 1.1 mrg 1742 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1743 1.1 mrg operator=(long double __r) 1744 1.1 mrg { 1745 1.2 christos _M_value = __r; 1746 1.1 mrg return *this; 1747 1.1 mrg } 1748 1.1 mrg 1749 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1750 1.1 mrg operator+=(long double __r) 1751 1.1 mrg { 1752 1.2 christos _M_value += __r; 1753 1.1 mrg return *this; 1754 1.1 mrg } 1755 1.1 mrg 1756 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1757 1.1 mrg operator-=(long double __r) 1758 1.1 mrg { 1759 1.2 christos _M_value -= __r; 1760 1.1 mrg return *this; 1761 1.1 mrg } 1762 1.1 mrg 1763 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1764 1.1 mrg operator*=(long double __r) 1765 1.1 mrg { 1766 1.1 mrg _M_value *= __r; 1767 1.1 mrg return *this; 1768 1.1 mrg } 1769 1.1 mrg 1770 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1771 1.1 mrg operator/=(long double __r) 1772 1.1 mrg { 1773 1.1 mrg _M_value /= __r; 1774 1.1 mrg return *this; 1775 1.1 mrg } 1776 1.1 mrg 1777 1.1 mrg // The compiler knows how to do this efficiently 1778 1.10 mrg #if __cplusplus >= 201103L 1779 1.10 mrg _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default; 1780 1.10 mrg #endif 1781 1.1 mrg 1782 1.1 mrg template<typename _Tp> 1783 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1784 1.1 mrg operator=(const complex<_Tp>& __z) 1785 1.1 mrg { 1786 1.10 mrg _M_value = __z.__rep(); 1787 1.1 mrg return *this; 1788 1.1 mrg } 1789 1.1 mrg 1790 1.1 mrg template<typename _Tp> 1791 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1792 1.1 mrg operator+=(const complex<_Tp>& __z) 1793 1.1 mrg { 1794 1.10 mrg _M_value += __z.__rep(); 1795 1.1 mrg return *this; 1796 1.1 mrg } 1797 1.1 mrg 1798 1.1 mrg template<typename _Tp> 1799 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1800 1.1 mrg operator-=(const complex<_Tp>& __z) 1801 1.1 mrg { 1802 1.10 mrg _M_value -= __z.__rep(); 1803 1.1 mrg return *this; 1804 1.1 mrg } 1805 1.1 mrg 1806 1.1 mrg template<typename _Tp> 1807 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1808 1.1 mrg operator*=(const complex<_Tp>& __z) 1809 1.1 mrg { 1810 1.10 mrg const _ComplexT __t = __z.__rep(); 1811 1.1 mrg _M_value *= __t; 1812 1.1 mrg return *this; 1813 1.1 mrg } 1814 1.1 mrg 1815 1.1 mrg template<typename _Tp> 1816 1.10 mrg _GLIBCXX20_CONSTEXPR complex& 1817 1.1 mrg operator/=(const complex<_Tp>& __z) 1818 1.1 mrg { 1819 1.10 mrg const _ComplexT __t = __z.__rep(); 1820 1.1 mrg _M_value /= __t; 1821 1.1 mrg return *this; 1822 1.1 mrg } 1823 1.1 mrg 1824 1.4 mrg _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; } 1825 1.1 mrg 1826 1.1 mrg private: 1827 1.1 mrg _ComplexT _M_value; 1828 1.1 mrg }; 1829 1.1 mrg 1830 1.15 mrg #if __cplusplus > 202002L 1831 1.15 mrg template<typename _Tp> 1832 1.15 mrg struct __complex_type 1833 1.15 mrg { }; 1834 1.15 mrg 1835 1.15 mrg #ifdef __STDCPP_FLOAT16_T__ 1836 1.15 mrg template<> 1837 1.15 mrg struct __complex_type<_Float16> 1838 1.15 mrg { typedef __complex__ _Float16 type; }; 1839 1.15 mrg #endif 1840 1.15 mrg 1841 1.15 mrg #ifdef __STDCPP_FLOAT32_T__ 1842 1.15 mrg template<> 1843 1.15 mrg struct __complex_type<_Float32> 1844 1.15 mrg { typedef __complex__ _Float32 type; }; 1845 1.15 mrg #endif 1846 1.15 mrg 1847 1.15 mrg #ifdef __STDCPP_FLOAT64_T__ 1848 1.15 mrg template<> 1849 1.15 mrg struct __complex_type<_Float64> 1850 1.15 mrg { typedef __complex__ _Float64 type; }; 1851 1.15 mrg #endif 1852 1.15 mrg 1853 1.15 mrg #ifdef __STDCPP_FLOAT128_T__ 1854 1.15 mrg template<> 1855 1.15 mrg struct __complex_type<_Float128> 1856 1.15 mrg { typedef __complex__ _Float128 type; }; 1857 1.15 mrg #endif 1858 1.15 mrg 1859 1.15 mrg #ifdef __STDCPP_BFLOAT16_T__ 1860 1.15 mrg template<> 1861 1.15 mrg struct __complex_type<__gnu_cxx::__bfloat16_t> 1862 1.15 mrg { typedef __complex__ decltype(0.0bf16) type; }; 1863 1.15 mrg #endif 1864 1.15 mrg 1865 1.15 mrg template<typename _Tp> 1866 1.15 mrg requires requires { typename __complex_type<_Tp>::type; } 1867 1.15 mrg class complex<_Tp> 1868 1.15 mrg { 1869 1.15 mrg public: 1870 1.15 mrg typedef _Tp value_type; 1871 1.15 mrg typedef typename std::__complex_type<_Tp>::type _ComplexT; 1872 1.15 mrg 1873 1.15 mrg constexpr complex(_ComplexT __z) : _M_value(__z) { } 1874 1.15 mrg 1875 1.15 mrg constexpr complex(_Tp __r = _Tp(), _Tp __i = _Tp()) 1876 1.15 mrg : _M_value{ __r, __i } { } 1877 1.15 mrg 1878 1.15 mrg template<typename _Up> 1879 1.15 mrg explicit(!requires(_Up __u) { value_type{__u}; }) 1880 1.15 mrg constexpr complex(const complex<_Up>& __z) 1881 1.15 mrg : _M_value{ value_type(__z.real()), value_type(__z.imag()) } { } 1882 1.15 mrg 1883 1.15 mrg constexpr _Tp 1884 1.15 mrg real() const { return __real__ _M_value; } 1885 1.15 mrg 1886 1.15 mrg constexpr _Tp 1887 1.15 mrg imag() const { return __imag__ _M_value; } 1888 1.15 mrg 1889 1.15 mrg constexpr void 1890 1.15 mrg real(_Tp __val) { __real__ _M_value = __val; } 1891 1.15 mrg 1892 1.15 mrg constexpr void 1893 1.15 mrg imag(_Tp __val) { __imag__ _M_value = __val; } 1894 1.15 mrg 1895 1.15 mrg constexpr complex& 1896 1.15 mrg operator=(_Tp __f) 1897 1.15 mrg { 1898 1.15 mrg _M_value = __f; 1899 1.15 mrg return *this; 1900 1.15 mrg } 1901 1.15 mrg 1902 1.15 mrg constexpr complex& 1903 1.15 mrg operator+=(_Tp __f) 1904 1.15 mrg { 1905 1.15 mrg _M_value += __f; 1906 1.15 mrg return *this; 1907 1.15 mrg } 1908 1.15 mrg 1909 1.15 mrg constexpr complex& 1910 1.15 mrg operator-=(_Tp __f) 1911 1.15 mrg { 1912 1.15 mrg _M_value -= __f; 1913 1.15 mrg return *this; 1914 1.15 mrg } 1915 1.15 mrg 1916 1.15 mrg constexpr complex& 1917 1.15 mrg operator*=(_Tp __f) 1918 1.15 mrg { 1919 1.15 mrg _M_value *= __f; 1920 1.15 mrg return *this; 1921 1.15 mrg } 1922 1.15 mrg 1923 1.15 mrg constexpr complex& 1924 1.15 mrg operator/=(_Tp __f) 1925 1.15 mrg { 1926 1.15 mrg _M_value /= __f; 1927 1.15 mrg return *this; 1928 1.15 mrg } 1929 1.15 mrg 1930 1.15 mrg // Let the compiler synthesize the copy and assignment 1931 1.15 mrg // operator. It always does a pretty good job. 1932 1.15 mrg constexpr complex(const complex&) = default; 1933 1.15 mrg constexpr complex& operator=(const complex&) = default; 1934 1.15 mrg 1935 1.15 mrg template<typename _Up> 1936 1.15 mrg constexpr complex& 1937 1.15 mrg operator=(const complex<_Up>& __z) 1938 1.15 mrg { 1939 1.15 mrg __real__ _M_value = __z.real(); 1940 1.15 mrg __imag__ _M_value = __z.imag(); 1941 1.15 mrg return *this; 1942 1.15 mrg } 1943 1.15 mrg 1944 1.15 mrg template<typename _Up> 1945 1.15 mrg constexpr complex& 1946 1.15 mrg operator+=(const complex<_Up>& __z) 1947 1.15 mrg { 1948 1.15 mrg _M_value += __z.__rep(); 1949 1.15 mrg return *this; 1950 1.15 mrg } 1951 1.15 mrg 1952 1.15 mrg template<class _Up> 1953 1.15 mrg constexpr complex& 1954 1.15 mrg operator-=(const complex<_Up>& __z) 1955 1.15 mrg { 1956 1.15 mrg _M_value -= __z.__rep(); 1957 1.15 mrg return *this; 1958 1.15 mrg } 1959 1.15 mrg 1960 1.15 mrg template<class _Up> 1961 1.15 mrg constexpr complex& 1962 1.15 mrg operator*=(const complex<_Up>& __z) 1963 1.15 mrg { 1964 1.15 mrg const _ComplexT __t = __z.__rep(); 1965 1.15 mrg _M_value *= __t; 1966 1.15 mrg return *this; 1967 1.15 mrg } 1968 1.15 mrg 1969 1.15 mrg template<class _Up> 1970 1.15 mrg constexpr complex& 1971 1.15 mrg operator/=(const complex<_Up>& __z) 1972 1.15 mrg { 1973 1.15 mrg const _ComplexT __t = __z.__rep(); 1974 1.15 mrg _M_value /= __t; 1975 1.15 mrg return *this; 1976 1.15 mrg } 1977 1.15 mrg 1978 1.15 mrg constexpr _ComplexT __rep() const { return _M_value; } 1979 1.15 mrg 1980 1.15 mrg private: 1981 1.15 mrg _ComplexT _M_value; 1982 1.15 mrg }; 1983 1.15 mrg #endif 1984 1.15 mrg 1985 1.15 mrg #if __cplusplus <= 202002L 1986 1.1 mrg // These bits have to be at the end of this file, so that the 1987 1.1 mrg // specializations have all been defined. 1988 1.2 christos inline _GLIBCXX_CONSTEXPR 1989 1.1 mrg complex<float>::complex(const complex<double>& __z) 1990 1.1 mrg : _M_value(__z.__rep()) { } 1991 1.1 mrg 1992 1.2 christos inline _GLIBCXX_CONSTEXPR 1993 1.1 mrg complex<float>::complex(const complex<long double>& __z) 1994 1.1 mrg : _M_value(__z.__rep()) { } 1995 1.1 mrg 1996 1.2 christos inline _GLIBCXX_CONSTEXPR 1997 1.1 mrg complex<double>::complex(const complex<long double>& __z) 1998 1.1 mrg : _M_value(__z.__rep()) { } 1999 1.15 mrg #endif 2000 1.1 mrg 2001 1.1 mrg // Inhibit implicit instantiations for required instantiations, 2002 1.1 mrg // which are defined via explicit instantiations elsewhere. 2003 1.1 mrg // NB: This syntax is a GNU extension. 2004 1.1 mrg #if _GLIBCXX_EXTERN_TEMPLATE 2005 1.1 mrg extern template istream& operator>>(istream&, complex<float>&); 2006 1.1 mrg extern template ostream& operator<<(ostream&, const complex<float>&); 2007 1.1 mrg extern template istream& operator>>(istream&, complex<double>&); 2008 1.1 mrg extern template ostream& operator<<(ostream&, const complex<double>&); 2009 1.1 mrg extern template istream& operator>>(istream&, complex<long double>&); 2010 1.1 mrg extern template ostream& operator<<(ostream&, const complex<long double>&); 2011 1.1 mrg 2012 1.1 mrg #ifdef _GLIBCXX_USE_WCHAR_T 2013 1.1 mrg extern template wistream& operator>>(wistream&, complex<float>&); 2014 1.1 mrg extern template wostream& operator<<(wostream&, const complex<float>&); 2015 1.1 mrg extern template wistream& operator>>(wistream&, complex<double>&); 2016 1.1 mrg extern template wostream& operator<<(wostream&, const complex<double>&); 2017 1.1 mrg extern template wistream& operator>>(wistream&, complex<long double>&); 2018 1.1 mrg extern template wostream& operator<<(wostream&, const complex<long double>&); 2019 1.1 mrg #endif 2020 1.1 mrg #endif 2021 1.1 mrg 2022 1.12 mrg /// @} group complex_numbers 2023 1.1 mrg 2024 1.2 christos _GLIBCXX_END_NAMESPACE_VERSION 2025 1.2 christos } // namespace 2026 1.1 mrg 2027 1.2 christos #if __cplusplus >= 201103L 2028 1.1 mrg 2029 1.2 christos namespace std _GLIBCXX_VISIBILITY(default) 2030 1.2 christos { 2031 1.2 christos _GLIBCXX_BEGIN_NAMESPACE_VERSION 2032 1.2 christos 2033 1.2 christos // Forward declarations. 2034 1.2 christos template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&); 2035 1.2 christos template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&); 2036 1.2 christos template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&); 2037 1.2 christos 2038 1.2 christos template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&); 2039 1.2 christos template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&); 2040 1.2 christos template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&); 2041 1.2 christos // DR 595. 2042 1.2 christos template<typename _Tp> _Tp fabs(const std::complex<_Tp>&); 2043 1.2 christos 2044 1.2 christos template<typename _Tp> 2045 1.2 christos inline std::complex<_Tp> 2046 1.2 christos __complex_acos(const std::complex<_Tp>& __z) 2047 1.2 christos { 2048 1.2 christos const std::complex<_Tp> __t = std::asin(__z); 2049 1.2 christos const _Tp __pi_2 = 1.5707963267948966192313216916397514L; 2050 1.2 christos return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag()); 2051 1.2 christos } 2052 1.2 christos 2053 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2054 1.15 mrg #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 2055 1.15 mrg inline __complex__ _Float16 2056 1.15 mrg __complex_acos(__complex__ _Float16 __z) 2057 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_cacosf(__z)); } 2058 1.15 mrg 2059 1.15 mrg inline __complex__ _Float16 2060 1.15 mrg __complex_asin(__complex__ _Float16 __z) 2061 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_casinf(__z)); } 2062 1.15 mrg 2063 1.15 mrg inline __complex__ _Float16 2064 1.15 mrg __complex_atan(__complex__ _Float16 __z) 2065 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_catanf(__z)); } 2066 1.15 mrg 2067 1.15 mrg inline __complex__ _Float16 2068 1.15 mrg __complex_acosh(__complex__ _Float16 __z) 2069 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_cacoshf(__z)); } 2070 1.15 mrg 2071 1.15 mrg inline __complex__ _Float16 2072 1.15 mrg __complex_asinh(__complex__ _Float16 __z) 2073 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_casinhf(__z)); } 2074 1.15 mrg 2075 1.15 mrg inline __complex__ _Float16 2076 1.15 mrg __complex_atanh(__complex__ _Float16 __z) 2077 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_catanhf(__z)); } 2078 1.15 mrg #endif 2079 1.15 mrg 2080 1.15 mrg #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 2081 1.15 mrg inline __complex__ _Float32 2082 1.15 mrg __complex_acos(__complex__ _Float32 __z) 2083 1.15 mrg { return __builtin_cacosf(__z); } 2084 1.15 mrg 2085 1.15 mrg inline __complex__ _Float32 2086 1.15 mrg __complex_asin(__complex__ _Float32 __z) 2087 1.15 mrg { return __builtin_casinf(__z); } 2088 1.15 mrg 2089 1.15 mrg inline __complex__ _Float32 2090 1.15 mrg __complex_atan(__complex__ _Float32 __z) 2091 1.15 mrg { return __builtin_catanf(__z); } 2092 1.15 mrg 2093 1.15 mrg inline __complex__ _Float32 2094 1.15 mrg __complex_acosh(__complex__ _Float32 __z) 2095 1.15 mrg { return __builtin_cacoshf(__z); } 2096 1.15 mrg 2097 1.15 mrg inline __complex__ _Float32 2098 1.15 mrg __complex_asinh(__complex__ _Float32 __z) 2099 1.15 mrg { return __builtin_casinhf(__z); } 2100 1.15 mrg 2101 1.15 mrg inline __complex__ _Float32 2102 1.15 mrg __complex_atanh(__complex__ _Float32 __z) 2103 1.15 mrg { return __builtin_catanhf(__z); } 2104 1.15 mrg #endif 2105 1.15 mrg 2106 1.15 mrg #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) 2107 1.15 mrg inline __complex__ _Float64 2108 1.15 mrg __complex_acos(__complex__ _Float64 __z) 2109 1.15 mrg { return __builtin_cacos(__z); } 2110 1.15 mrg 2111 1.15 mrg inline __complex__ _Float64 2112 1.15 mrg __complex_asin(__complex__ _Float64 __z) 2113 1.15 mrg { return __builtin_casin(__z); } 2114 1.15 mrg 2115 1.15 mrg inline __complex__ _Float64 2116 1.15 mrg __complex_atan(__complex__ _Float64 __z) 2117 1.15 mrg { return __builtin_catan(__z); } 2118 1.15 mrg 2119 1.15 mrg inline __complex__ _Float64 2120 1.15 mrg __complex_acosh(__complex__ _Float64 __z) 2121 1.15 mrg { return __builtin_cacosh(__z); } 2122 1.15 mrg 2123 1.15 mrg inline __complex__ _Float64 2124 1.15 mrg __complex_asinh(__complex__ _Float64 __z) 2125 1.15 mrg { return __builtin_casinh(__z); } 2126 1.15 mrg 2127 1.15 mrg inline __complex__ _Float64 2128 1.15 mrg __complex_atanh(__complex__ _Float64 __z) 2129 1.15 mrg { return __builtin_catanh(__z); } 2130 1.15 mrg #endif 2131 1.15 mrg 2132 1.15 mrg #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) 2133 1.15 mrg inline __complex__ _Float128 2134 1.15 mrg __complex_acos(__complex__ _Float128 __z) 2135 1.15 mrg { return __builtin_cacosl(__z); } 2136 1.15 mrg 2137 1.15 mrg inline __complex__ _Float128 2138 1.15 mrg __complex_asin(__complex__ _Float128 __z) 2139 1.15 mrg { return __builtin_casinl(__z); } 2140 1.15 mrg 2141 1.15 mrg inline __complex__ _Float128 2142 1.15 mrg __complex_atan(__complex__ _Float128 __z) 2143 1.15 mrg { return __builtin_catanl(__z); } 2144 1.15 mrg 2145 1.15 mrg inline __complex__ _Float128 2146 1.15 mrg __complex_acosh(__complex__ _Float128 __z) 2147 1.15 mrg { return __builtin_cacoshl(__z); } 2148 1.15 mrg 2149 1.15 mrg inline __complex__ _Float128 2150 1.15 mrg __complex_asinh(__complex__ _Float128 __z) 2151 1.15 mrg { return __builtin_casinhl(__z); } 2152 1.15 mrg 2153 1.15 mrg inline __complex__ _Float128 2154 1.15 mrg __complex_atanh(__complex__ _Float128 __z) 2155 1.15 mrg { return __builtin_catanhl(__z); } 2156 1.15 mrg #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH) 2157 1.15 mrg inline __complex__ _Float128 2158 1.15 mrg __complex_acos(__complex__ _Float128 __z) 2159 1.15 mrg { return __builtin_cacosf128(__z); } 2160 1.15 mrg 2161 1.15 mrg inline __complex__ _Float128 2162 1.15 mrg __complex_asin(__complex__ _Float128 __z) 2163 1.15 mrg { return __builtin_casinf128(__z); } 2164 1.15 mrg 2165 1.15 mrg inline __complex__ _Float128 2166 1.15 mrg __complex_atan(__complex__ _Float128 __z) 2167 1.15 mrg { return __builtin_catanf128(__z); } 2168 1.15 mrg 2169 1.15 mrg inline __complex__ _Float128 2170 1.15 mrg __complex_acosh(__complex__ _Float128 __z) 2171 1.15 mrg { return __builtin_cacoshf128(__z); } 2172 1.15 mrg 2173 1.15 mrg inline __complex__ _Float128 2174 1.15 mrg __complex_asinh(__complex__ _Float128 __z) 2175 1.15 mrg { return __builtin_casinhf128(__z); } 2176 1.15 mrg 2177 1.15 mrg inline __complex__ _Float128 2178 1.15 mrg __complex_atanh(__complex__ _Float128 __z) 2179 1.15 mrg { return __builtin_catanhf128(__z); } 2180 1.15 mrg #endif 2181 1.15 mrg 2182 1.15 mrg #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 2183 1.15 mrg inline __complex__ decltype(0.0bf16) 2184 1.15 mrg __complex_acos(__complex__ decltype(0.0bf16) __z) 2185 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cacosf(__z)); } 2186 1.15 mrg 2187 1.15 mrg inline __complex__ decltype(0.0bf16) 2188 1.15 mrg __complex_asin(__complex__ decltype(0.0bf16) __z) 2189 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_casinf(__z)); } 2190 1.15 mrg 2191 1.15 mrg inline __complex__ decltype(0.0bf16) 2192 1.15 mrg __complex_atan(__complex__ decltype(0.0bf16) __z) 2193 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_catanf(__z)); } 2194 1.15 mrg 2195 1.15 mrg inline __complex__ decltype(0.0bf16) 2196 1.15 mrg __complex_acosh(__complex__ decltype(0.0bf16) __z) 2197 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cacoshf(__z)); } 2198 1.15 mrg 2199 1.15 mrg inline __complex__ decltype(0.0bf16) 2200 1.15 mrg __complex_asinh(__complex__ decltype(0.0bf16) __z) 2201 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_casinhf(__z)); } 2202 1.15 mrg 2203 1.15 mrg inline __complex__ decltype(0.0bf16) 2204 1.15 mrg __complex_atanh(__complex__ decltype(0.0bf16) __z) 2205 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_catanhf(__z)); } 2206 1.15 mrg #endif 2207 1.15 mrg #endif 2208 1.15 mrg 2209 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2210 1.2 christos inline __complex__ float 2211 1.2 christos __complex_acos(__complex__ float __z) 2212 1.2 christos { return __builtin_cacosf(__z); } 2213 1.2 christos 2214 1.2 christos inline __complex__ double 2215 1.2 christos __complex_acos(__complex__ double __z) 2216 1.2 christos { return __builtin_cacos(__z); } 2217 1.2 christos 2218 1.2 christos inline __complex__ long double 2219 1.2 christos __complex_acos(const __complex__ long double& __z) 2220 1.2 christos { return __builtin_cacosl(__z); } 2221 1.2 christos 2222 1.2 christos template<typename _Tp> 2223 1.2 christos inline std::complex<_Tp> 2224 1.2 christos acos(const std::complex<_Tp>& __z) 2225 1.2 christos { return __complex_acos(__z.__rep()); } 2226 1.2 christos #else 2227 1.2 christos /// acos(__z) [8.1.2]. 2228 1.2 christos // Effects: Behaves the same as C99 function cacos, defined 2229 1.2 christos // in subclause 7.3.5.1. 2230 1.2 christos template<typename _Tp> 2231 1.2 christos inline std::complex<_Tp> 2232 1.2 christos acos(const std::complex<_Tp>& __z) 2233 1.2 christos { return __complex_acos(__z); } 2234 1.2 christos #endif 2235 1.2 christos 2236 1.2 christos template<typename _Tp> 2237 1.2 christos inline std::complex<_Tp> 2238 1.2 christos __complex_asin(const std::complex<_Tp>& __z) 2239 1.2 christos { 2240 1.2 christos std::complex<_Tp> __t(-__z.imag(), __z.real()); 2241 1.2 christos __t = std::asinh(__t); 2242 1.2 christos return std::complex<_Tp>(__t.imag(), -__t.real()); 2243 1.2 christos } 2244 1.2 christos 2245 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2246 1.2 christos inline __complex__ float 2247 1.2 christos __complex_asin(__complex__ float __z) 2248 1.2 christos { return __builtin_casinf(__z); } 2249 1.2 christos 2250 1.2 christos inline __complex__ double 2251 1.2 christos __complex_asin(__complex__ double __z) 2252 1.2 christos { return __builtin_casin(__z); } 2253 1.2 christos 2254 1.2 christos inline __complex__ long double 2255 1.2 christos __complex_asin(const __complex__ long double& __z) 2256 1.2 christos { return __builtin_casinl(__z); } 2257 1.2 christos 2258 1.2 christos template<typename _Tp> 2259 1.2 christos inline std::complex<_Tp> 2260 1.2 christos asin(const std::complex<_Tp>& __z) 2261 1.2 christos { return __complex_asin(__z.__rep()); } 2262 1.2 christos #else 2263 1.2 christos /// asin(__z) [8.1.3]. 2264 1.2 christos // Effects: Behaves the same as C99 function casin, defined 2265 1.2 christos // in subclause 7.3.5.2. 2266 1.2 christos template<typename _Tp> 2267 1.2 christos inline std::complex<_Tp> 2268 1.2 christos asin(const std::complex<_Tp>& __z) 2269 1.2 christos { return __complex_asin(__z); } 2270 1.2 christos #endif 2271 1.8 mrg 2272 1.2 christos template<typename _Tp> 2273 1.2 christos std::complex<_Tp> 2274 1.2 christos __complex_atan(const std::complex<_Tp>& __z) 2275 1.2 christos { 2276 1.2 christos const _Tp __r2 = __z.real() * __z.real(); 2277 1.2 christos const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag(); 2278 1.2 christos 2279 1.2 christos _Tp __num = __z.imag() + _Tp(1.0); 2280 1.2 christos _Tp __den = __z.imag() - _Tp(1.0); 2281 1.2 christos 2282 1.2 christos __num = __r2 + __num * __num; 2283 1.2 christos __den = __r2 + __den * __den; 2284 1.2 christos 2285 1.2 christos return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x), 2286 1.2 christos _Tp(0.25) * log(__num / __den)); 2287 1.2 christos } 2288 1.2 christos 2289 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2290 1.2 christos inline __complex__ float 2291 1.2 christos __complex_atan(__complex__ float __z) 2292 1.2 christos { return __builtin_catanf(__z); } 2293 1.2 christos 2294 1.2 christos inline __complex__ double 2295 1.2 christos __complex_atan(__complex__ double __z) 2296 1.2 christos { return __builtin_catan(__z); } 2297 1.2 christos 2298 1.2 christos inline __complex__ long double 2299 1.2 christos __complex_atan(const __complex__ long double& __z) 2300 1.2 christos { return __builtin_catanl(__z); } 2301 1.2 christos 2302 1.2 christos template<typename _Tp> 2303 1.2 christos inline std::complex<_Tp> 2304 1.2 christos atan(const std::complex<_Tp>& __z) 2305 1.2 christos { return __complex_atan(__z.__rep()); } 2306 1.2 christos #else 2307 1.2 christos /// atan(__z) [8.1.4]. 2308 1.2 christos // Effects: Behaves the same as C99 function catan, defined 2309 1.2 christos // in subclause 7.3.5.3. 2310 1.2 christos template<typename _Tp> 2311 1.2 christos inline std::complex<_Tp> 2312 1.2 christos atan(const std::complex<_Tp>& __z) 2313 1.2 christos { return __complex_atan(__z); } 2314 1.2 christos #endif 2315 1.2 christos 2316 1.2 christos template<typename _Tp> 2317 1.2 christos std::complex<_Tp> 2318 1.2 christos __complex_acosh(const std::complex<_Tp>& __z) 2319 1.2 christos { 2320 1.2 christos // Kahan's formula. 2321 1.2 christos return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0))) 2322 1.2 christos + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0)))); 2323 1.2 christos } 2324 1.2 christos 2325 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2326 1.2 christos inline __complex__ float 2327 1.2 christos __complex_acosh(__complex__ float __z) 2328 1.2 christos { return __builtin_cacoshf(__z); } 2329 1.2 christos 2330 1.2 christos inline __complex__ double 2331 1.2 christos __complex_acosh(__complex__ double __z) 2332 1.2 christos { return __builtin_cacosh(__z); } 2333 1.2 christos 2334 1.2 christos inline __complex__ long double 2335 1.2 christos __complex_acosh(const __complex__ long double& __z) 2336 1.2 christos { return __builtin_cacoshl(__z); } 2337 1.2 christos 2338 1.2 christos template<typename _Tp> 2339 1.2 christos inline std::complex<_Tp> 2340 1.2 christos acosh(const std::complex<_Tp>& __z) 2341 1.2 christos { return __complex_acosh(__z.__rep()); } 2342 1.2 christos #else 2343 1.2 christos /// acosh(__z) [8.1.5]. 2344 1.2 christos // Effects: Behaves the same as C99 function cacosh, defined 2345 1.2 christos // in subclause 7.3.6.1. 2346 1.2 christos template<typename _Tp> 2347 1.2 christos inline std::complex<_Tp> 2348 1.2 christos acosh(const std::complex<_Tp>& __z) 2349 1.2 christos { return __complex_acosh(__z); } 2350 1.2 christos #endif 2351 1.2 christos 2352 1.2 christos template<typename _Tp> 2353 1.2 christos std::complex<_Tp> 2354 1.2 christos __complex_asinh(const std::complex<_Tp>& __z) 2355 1.2 christos { 2356 1.2 christos std::complex<_Tp> __t((__z.real() - __z.imag()) 2357 1.2 christos * (__z.real() + __z.imag()) + _Tp(1.0), 2358 1.2 christos _Tp(2.0) * __z.real() * __z.imag()); 2359 1.2 christos __t = std::sqrt(__t); 2360 1.2 christos 2361 1.2 christos return std::log(__t + __z); 2362 1.2 christos } 2363 1.2 christos 2364 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2365 1.2 christos inline __complex__ float 2366 1.2 christos __complex_asinh(__complex__ float __z) 2367 1.2 christos { return __builtin_casinhf(__z); } 2368 1.2 christos 2369 1.2 christos inline __complex__ double 2370 1.2 christos __complex_asinh(__complex__ double __z) 2371 1.2 christos { return __builtin_casinh(__z); } 2372 1.2 christos 2373 1.2 christos inline __complex__ long double 2374 1.2 christos __complex_asinh(const __complex__ long double& __z) 2375 1.2 christos { return __builtin_casinhl(__z); } 2376 1.2 christos 2377 1.2 christos template<typename _Tp> 2378 1.2 christos inline std::complex<_Tp> 2379 1.2 christos asinh(const std::complex<_Tp>& __z) 2380 1.2 christos { return __complex_asinh(__z.__rep()); } 2381 1.2 christos #else 2382 1.2 christos /// asinh(__z) [8.1.6]. 2383 1.2 christos // Effects: Behaves the same as C99 function casin, defined 2384 1.2 christos // in subclause 7.3.6.2. 2385 1.2 christos template<typename _Tp> 2386 1.2 christos inline std::complex<_Tp> 2387 1.2 christos asinh(const std::complex<_Tp>& __z) 2388 1.2 christos { return __complex_asinh(__z); } 2389 1.2 christos #endif 2390 1.2 christos 2391 1.2 christos template<typename _Tp> 2392 1.2 christos std::complex<_Tp> 2393 1.2 christos __complex_atanh(const std::complex<_Tp>& __z) 2394 1.2 christos { 2395 1.2 christos const _Tp __i2 = __z.imag() * __z.imag(); 2396 1.2 christos const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real(); 2397 1.2 christos 2398 1.2 christos _Tp __num = _Tp(1.0) + __z.real(); 2399 1.2 christos _Tp __den = _Tp(1.0) - __z.real(); 2400 1.2 christos 2401 1.2 christos __num = __i2 + __num * __num; 2402 1.2 christos __den = __i2 + __den * __den; 2403 1.2 christos 2404 1.2 christos return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)), 2405 1.2 christos _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x)); 2406 1.2 christos } 2407 1.2 christos 2408 1.15 mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC 2409 1.2 christos inline __complex__ float 2410 1.2 christos __complex_atanh(__complex__ float __z) 2411 1.2 christos { return __builtin_catanhf(__z); } 2412 1.2 christos 2413 1.2 christos inline __complex__ double 2414 1.2 christos __complex_atanh(__complex__ double __z) 2415 1.2 christos { return __builtin_catanh(__z); } 2416 1.2 christos 2417 1.2 christos inline __complex__ long double 2418 1.2 christos __complex_atanh(const __complex__ long double& __z) 2419 1.2 christos { return __builtin_catanhl(__z); } 2420 1.2 christos 2421 1.2 christos template<typename _Tp> 2422 1.2 christos inline std::complex<_Tp> 2423 1.2 christos atanh(const std::complex<_Tp>& __z) 2424 1.2 christos { return __complex_atanh(__z.__rep()); } 2425 1.2 christos #else 2426 1.2 christos /// atanh(__z) [8.1.7]. 2427 1.2 christos // Effects: Behaves the same as C99 function catanh, defined 2428 1.2 christos // in subclause 7.3.6.3. 2429 1.2 christos template<typename _Tp> 2430 1.2 christos inline std::complex<_Tp> 2431 1.2 christos atanh(const std::complex<_Tp>& __z) 2432 1.2 christos { return __complex_atanh(__z); } 2433 1.2 christos #endif 2434 1.2 christos 2435 1.2 christos template<typename _Tp> 2436 1.2 christos inline _Tp 2437 1.2 christos /// fabs(__z) [8.1.8]. 2438 1.2 christos // Effects: Behaves the same as C99 function cabs, defined 2439 1.2 christos // in subclause 7.3.8.1. 2440 1.2 christos fabs(const std::complex<_Tp>& __z) 2441 1.2 christos { return std::abs(__z); } 2442 1.2 christos 2443 1.2 christos /// Additional overloads [8.1.9]. 2444 1.2 christos template<typename _Tp> 2445 1.2 christos inline typename __gnu_cxx::__promote<_Tp>::__type 2446 1.2 christos arg(_Tp __x) 2447 1.2 christos { 2448 1.2 christos typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 2449 1.6 mrg #if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) 2450 1.2 christos return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L) 2451 1.2 christos : __type(); 2452 1.2 christos #else 2453 1.2 christos return std::arg(std::complex<__type>(__x)); 2454 1.2 christos #endif 2455 1.2 christos } 2456 1.2 christos 2457 1.2 christos template<typename _Tp> 2458 1.8 mrg _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type 2459 1.2 christos imag(_Tp) 2460 1.2 christos { return _Tp(); } 2461 1.2 christos 2462 1.2 christos template<typename _Tp> 2463 1.10 mrg _GLIBCXX20_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type 2464 1.2 christos norm(_Tp __x) 2465 1.2 christos { 2466 1.2 christos typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 2467 1.2 christos return __type(__x) * __type(__x); 2468 1.2 christos } 2469 1.2 christos 2470 1.2 christos template<typename _Tp> 2471 1.8 mrg _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type 2472 1.2 christos real(_Tp __x) 2473 1.2 christos { return __x; } 2474 1.2 christos 2475 1.2 christos template<typename _Tp, typename _Up> 2476 1.2 christos inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 2477 1.2 christos pow(const std::complex<_Tp>& __x, const _Up& __y) 2478 1.2 christos { 2479 1.2 christos typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 2480 1.2 christos return std::pow(std::complex<__type>(__x), __type(__y)); 2481 1.2 christos } 2482 1.2 christos 2483 1.2 christos template<typename _Tp, typename _Up> 2484 1.2 christos inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 2485 1.2 christos pow(const _Tp& __x, const std::complex<_Up>& __y) 2486 1.2 christos { 2487 1.2 christos typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 2488 1.2 christos return std::pow(__type(__x), std::complex<__type>(__y)); 2489 1.2 christos } 2490 1.2 christos 2491 1.2 christos template<typename _Tp, typename _Up> 2492 1.2 christos inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 2493 1.2 christos pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y) 2494 1.2 christos { 2495 1.2 christos typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 2496 1.2 christos return std::pow(std::complex<__type>(__x), 2497 1.2 christos std::complex<__type>(__y)); 2498 1.2 christos } 2499 1.1 mrg 2500 1.1 mrg // Forward declarations. 2501 1.1 mrg // DR 781. 2502 1.10 mrg template<typename _Tp> 2503 1.10 mrg std::complex<_Tp> proj(const std::complex<_Tp>&); 2504 1.1 mrg 2505 1.10 mrg // Generic implementation of std::proj, does not work for infinities. 2506 1.1 mrg template<typename _Tp> 2507 1.10 mrg inline std::complex<_Tp> 2508 1.1 mrg __complex_proj(const std::complex<_Tp>& __z) 2509 1.10 mrg { return __z; } 2510 1.1 mrg 2511 1.1 mrg #if _GLIBCXX_USE_C99_COMPLEX 2512 1.10 mrg inline complex<float> 2513 1.10 mrg __complex_proj(const complex<float>& __z) 2514 1.10 mrg { return __builtin_cprojf(__z.__rep()); } 2515 1.10 mrg 2516 1.10 mrg inline complex<double> 2517 1.10 mrg __complex_proj(const complex<double>& __z) 2518 1.10 mrg { return __builtin_cproj(__z.__rep()); } 2519 1.10 mrg 2520 1.10 mrg inline complex<long double> 2521 1.10 mrg __complex_proj(const complex<long double>& __z) 2522 1.10 mrg { return __builtin_cprojl(__z.__rep()); } 2523 1.15 mrg 2524 1.15 mrg #if __cplusplus > 202002L 2525 1.15 mrg #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 2526 1.15 mrg inline __complex__ _Float16 2527 1.15 mrg __complex_proj(__complex__ _Float16 __z) 2528 1.15 mrg { return static_cast<__complex__ _Float16>(__builtin_cprojf(__z)); } 2529 1.15 mrg #endif 2530 1.15 mrg 2531 1.15 mrg #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 2532 1.15 mrg inline __complex__ _Float32 2533 1.15 mrg __complex_proj(__complex__ _Float32 __z) 2534 1.15 mrg { return __builtin_cprojf(__z); } 2535 1.15 mrg #endif 2536 1.15 mrg 2537 1.15 mrg #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) 2538 1.15 mrg inline __complex__ _Float64 2539 1.15 mrg __complex_proj(__complex__ _Float64 __z) 2540 1.15 mrg { return __builtin_cproj(__z); } 2541 1.15 mrg #endif 2542 1.15 mrg 2543 1.15 mrg #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) 2544 1.15 mrg inline __complex__ _Float128 2545 1.15 mrg __complex_proj(__complex__ _Float128 __z) 2546 1.15 mrg { return __builtin_cprojl(__z); } 2547 1.15 mrg #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH) 2548 1.15 mrg inline __complex__ _Float128 2549 1.15 mrg __complex_proj(__complex__ _Float128 __z) 2550 1.15 mrg { return __builtin_cprojf128(__z); } 2551 1.15 mrg #endif 2552 1.15 mrg 2553 1.15 mrg #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) 2554 1.15 mrg inline __complex__ decltype(0.0bf16) 2555 1.15 mrg __complex_proj(__complex__ decltype(0.0bf16) __z) 2556 1.15 mrg { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cprojf(__z)); } 2557 1.15 mrg #endif 2558 1.15 mrg 2559 1.15 mrg template<typename _Tp> 2560 1.15 mrg requires requires { typename __complex_type<_Tp>::type; } 2561 1.15 mrg inline complex<_Tp> 2562 1.15 mrg __complex_proj(const complex<_Tp>& __z) 2563 1.15 mrg { return __complex_proj(__z.__rep()); } 2564 1.15 mrg #endif 2565 1.15 mrg 2566 1.15 mrg #elif defined _GLIBCXX_USE_C99_MATH_FUNCS 2567 1.10 mrg inline complex<float> 2568 1.10 mrg __complex_proj(const complex<float>& __z) 2569 1.10 mrg { 2570 1.10 mrg if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag())) 2571 1.10 mrg return complex<float>(__builtin_inff(), 2572 1.10 mrg __builtin_copysignf(0.0f, __z.imag())); 2573 1.10 mrg return __z; 2574 1.10 mrg } 2575 1.10 mrg 2576 1.10 mrg inline complex<double> 2577 1.10 mrg __complex_proj(const complex<double>& __z) 2578 1.10 mrg { 2579 1.10 mrg if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag())) 2580 1.10 mrg return complex<double>(__builtin_inf(), 2581 1.10 mrg __builtin_copysign(0.0, __z.imag())); 2582 1.10 mrg return __z; 2583 1.10 mrg } 2584 1.10 mrg 2585 1.10 mrg inline complex<long double> 2586 1.10 mrg __complex_proj(const complex<long double>& __z) 2587 1.10 mrg { 2588 1.10 mrg if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag())) 2589 1.10 mrg return complex<long double>(__builtin_infl(), 2590 1.10 mrg __builtin_copysignl(0.0l, __z.imag())); 2591 1.10 mrg return __z; 2592 1.10 mrg } 2593 1.10 mrg #endif 2594 1.1 mrg 2595 1.1 mrg template<typename _Tp> 2596 1.1 mrg inline std::complex<_Tp> 2597 1.1 mrg proj(const std::complex<_Tp>& __z) 2598 1.1 mrg { return __complex_proj(__z); } 2599 1.1 mrg 2600 1.10 mrg // Overload for scalars 2601 1.1 mrg template<typename _Tp> 2602 1.8 mrg inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type> 2603 1.1 mrg proj(_Tp __x) 2604 1.8 mrg { 2605 1.8 mrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 2606 1.8 mrg return std::proj(std::complex<__type>(__x)); 2607 1.8 mrg } 2608 1.1 mrg 2609 1.1 mrg template<typename _Tp> 2610 1.10 mrg inline _GLIBCXX20_CONSTEXPR 2611 1.10 mrg std::complex<typename __gnu_cxx::__promote<_Tp>::__type> 2612 1.1 mrg conj(_Tp __x) 2613 1.8 mrg { 2614 1.8 mrg typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 2615 1.8 mrg return std::complex<__type>(__x, -__type()); 2616 1.8 mrg } 2617 1.1 mrg 2618 1.15 mrg #ifdef __cpp_lib_complex_udls // C++ >= 14 2619 1.4 mrg 2620 1.4 mrg inline namespace literals { 2621 1.4 mrg inline namespace complex_literals { 2622 1.9 mrg #pragma GCC diagnostic push 2623 1.9 mrg #pragma GCC diagnostic ignored "-Wliteral-suffix" 2624 1.4 mrg 2625 1.4 mrg constexpr std::complex<float> 2626 1.4 mrg operator""if(long double __num) 2627 1.4 mrg { return std::complex<float>{0.0F, static_cast<float>(__num)}; } 2628 1.4 mrg 2629 1.4 mrg constexpr std::complex<float> 2630 1.4 mrg operator""if(unsigned long long __num) 2631 1.4 mrg { return std::complex<float>{0.0F, static_cast<float>(__num)}; } 2632 1.4 mrg 2633 1.4 mrg constexpr std::complex<double> 2634 1.4 mrg operator""i(long double __num) 2635 1.4 mrg { return std::complex<double>{0.0, static_cast<double>(__num)}; } 2636 1.4 mrg 2637 1.4 mrg constexpr std::complex<double> 2638 1.4 mrg operator""i(unsigned long long __num) 2639 1.4 mrg { return std::complex<double>{0.0, static_cast<double>(__num)}; } 2640 1.4 mrg 2641 1.4 mrg constexpr std::complex<long double> 2642 1.4 mrg operator""il(long double __num) 2643 1.4 mrg { return std::complex<long double>{0.0L, __num}; } 2644 1.4 mrg 2645 1.4 mrg constexpr std::complex<long double> 2646 1.4 mrg operator""il(unsigned long long __num) 2647 1.4 mrg { return std::complex<long double>{0.0L, static_cast<long double>(__num)}; } 2648 1.4 mrg 2649 1.9 mrg #pragma GCC diagnostic pop 2650 1.4 mrg } // inline namespace complex_literals 2651 1.4 mrg } // inline namespace literals 2652 1.4 mrg 2653 1.15 mrg #endif // __cpp_lib_complex_udls 2654 1.4 mrg 2655 1.9 mrg _GLIBCXX_END_NAMESPACE_VERSION 2656 1.2 christos } // namespace 2657 1.1 mrg 2658 1.2 christos #endif // C++11 2659 1.1 mrg 2660 1.15 mrg #ifdef __clang__ 2661 1.15 mrg #pragma clang diagnostic pop 2662 1.15 mrg #endif 2663 1.15 mrg 2664 1.2 christos #endif /* _GLIBCXX_COMPLEX */ 2665