1d999cbc9SJohannes Doerfert#pragma once 2d999cbc9SJohannes Doerfert 3d999cbc9SJohannes Doerfert#include <cmath> 4d999cbc9SJohannes Doerfert 5d999cbc9SJohannes Doerfert#define INFINITY (__builtin_inff()) 6*56069b5cSJohannes Doerfert#define NAN (__builtin_nanf ("")) 7d999cbc9SJohannes Doerfert 8d999cbc9SJohannes Doerfertnamespace std { 9d999cbc9SJohannes Doerfert 10d999cbc9SJohannes Doerfert// Taken from libc++ 11d999cbc9SJohannes Doerferttemplate <class _Tp> 12d999cbc9SJohannes Doerfertclass complex { 13d999cbc9SJohannes Doerfertpublic: 14d999cbc9SJohannes Doerfert typedef _Tp value_type; 15d999cbc9SJohannes Doerfert 16d999cbc9SJohannes Doerfertprivate: 17d999cbc9SJohannes Doerfert value_type __re_; 18d999cbc9SJohannes Doerfert value_type __im_; 19d999cbc9SJohannes Doerfert 20d999cbc9SJohannes Doerfertpublic: 21d999cbc9SJohannes Doerfert complex(const value_type &__re = value_type(), const value_type &__im = value_type()) 22d999cbc9SJohannes Doerfert : __re_(__re), __im_(__im) {} 23d999cbc9SJohannes Doerfert template <class _Xp> 24d999cbc9SJohannes Doerfert complex(const complex<_Xp> &__c) 25d999cbc9SJohannes Doerfert : __re_(__c.real()), __im_(__c.imag()) {} 26d999cbc9SJohannes Doerfert 27d999cbc9SJohannes Doerfert value_type real() const { return __re_; } 28d999cbc9SJohannes Doerfert value_type imag() const { return __im_; } 29d999cbc9SJohannes Doerfert 30d999cbc9SJohannes Doerfert void real(value_type __re) { __re_ = __re; } 31d999cbc9SJohannes Doerfert void imag(value_type __im) { __im_ = __im; } 32d999cbc9SJohannes Doerfert 33d999cbc9SJohannes Doerfert complex &operator=(const value_type &__re) { 34d999cbc9SJohannes Doerfert __re_ = __re; 35d999cbc9SJohannes Doerfert __im_ = value_type(); 36d999cbc9SJohannes Doerfert return *this; 37d999cbc9SJohannes Doerfert } 38d999cbc9SJohannes Doerfert complex &operator+=(const value_type &__re) { 39d999cbc9SJohannes Doerfert __re_ += __re; 40d999cbc9SJohannes Doerfert return *this; 41d999cbc9SJohannes Doerfert } 42d999cbc9SJohannes Doerfert complex &operator-=(const value_type &__re) { 43d999cbc9SJohannes Doerfert __re_ -= __re; 44d999cbc9SJohannes Doerfert return *this; 45d999cbc9SJohannes Doerfert } 46d999cbc9SJohannes Doerfert complex &operator*=(const value_type &__re) { 47d999cbc9SJohannes Doerfert __re_ *= __re; 48d999cbc9SJohannes Doerfert __im_ *= __re; 49d999cbc9SJohannes Doerfert return *this; 50d999cbc9SJohannes Doerfert } 51d999cbc9SJohannes Doerfert complex &operator/=(const value_type &__re) { 52d999cbc9SJohannes Doerfert __re_ /= __re; 53d999cbc9SJohannes Doerfert __im_ /= __re; 54d999cbc9SJohannes Doerfert return *this; 55d999cbc9SJohannes Doerfert } 56d999cbc9SJohannes Doerfert 57d999cbc9SJohannes Doerfert template <class _Xp> 58d999cbc9SJohannes Doerfert complex &operator=(const complex<_Xp> &__c) { 59d999cbc9SJohannes Doerfert __re_ = __c.real(); 60d999cbc9SJohannes Doerfert __im_ = __c.imag(); 61d999cbc9SJohannes Doerfert return *this; 62d999cbc9SJohannes Doerfert } 63d999cbc9SJohannes Doerfert template <class _Xp> 64d999cbc9SJohannes Doerfert complex &operator+=(const complex<_Xp> &__c) { 65d999cbc9SJohannes Doerfert __re_ += __c.real(); 66d999cbc9SJohannes Doerfert __im_ += __c.imag(); 67d999cbc9SJohannes Doerfert return *this; 68d999cbc9SJohannes Doerfert } 69d999cbc9SJohannes Doerfert template <class _Xp> 70d999cbc9SJohannes Doerfert complex &operator-=(const complex<_Xp> &__c) { 71d999cbc9SJohannes Doerfert __re_ -= __c.real(); 72d999cbc9SJohannes Doerfert __im_ -= __c.imag(); 73d999cbc9SJohannes Doerfert return *this; 74d999cbc9SJohannes Doerfert } 75d999cbc9SJohannes Doerfert template <class _Xp> 76d999cbc9SJohannes Doerfert complex &operator*=(const complex<_Xp> &__c) { 77d999cbc9SJohannes Doerfert *this = *this * complex(__c.real(), __c.imag()); 78d999cbc9SJohannes Doerfert return *this; 79d999cbc9SJohannes Doerfert } 80d999cbc9SJohannes Doerfert template <class _Xp> 81d999cbc9SJohannes Doerfert complex &operator/=(const complex<_Xp> &__c) { 82d999cbc9SJohannes Doerfert *this = *this / complex(__c.real(), __c.imag()); 83d999cbc9SJohannes Doerfert return *this; 84d999cbc9SJohannes Doerfert } 85d999cbc9SJohannes Doerfert}; 86d999cbc9SJohannes Doerfert 87d999cbc9SJohannes Doerferttemplate <class _Tp> 88d999cbc9SJohannes Doerfertinline complex<_Tp> 89d999cbc9SJohannes Doerfertoperator+(const complex<_Tp> &__x, const complex<_Tp> &__y) { 90d999cbc9SJohannes Doerfert complex<_Tp> __t(__x); 91d999cbc9SJohannes Doerfert __t += __y; 92d999cbc9SJohannes Doerfert return __t; 93d999cbc9SJohannes Doerfert} 94d999cbc9SJohannes Doerfert 95d999cbc9SJohannes Doerferttemplate <class _Tp> 96d999cbc9SJohannes Doerfertinline complex<_Tp> 97d999cbc9SJohannes Doerfertoperator+(const complex<_Tp> &__x, const _Tp &__y) { 98d999cbc9SJohannes Doerfert complex<_Tp> __t(__x); 99d999cbc9SJohannes Doerfert __t += __y; 100d999cbc9SJohannes Doerfert return __t; 101d999cbc9SJohannes Doerfert} 102d999cbc9SJohannes Doerfert 103d999cbc9SJohannes Doerferttemplate <class _Tp> 104d999cbc9SJohannes Doerfertinline complex<_Tp> 105d999cbc9SJohannes Doerfertoperator+(const _Tp &__x, const complex<_Tp> &__y) { 106d999cbc9SJohannes Doerfert complex<_Tp> __t(__y); 107d999cbc9SJohannes Doerfert __t += __x; 108d999cbc9SJohannes Doerfert return __t; 109d999cbc9SJohannes Doerfert} 110d999cbc9SJohannes Doerfert 111d999cbc9SJohannes Doerferttemplate <class _Tp> 112d999cbc9SJohannes Doerfertinline complex<_Tp> 113d999cbc9SJohannes Doerfertoperator-(const complex<_Tp> &__x, const complex<_Tp> &__y) { 114d999cbc9SJohannes Doerfert complex<_Tp> __t(__x); 115d999cbc9SJohannes Doerfert __t -= __y; 116d999cbc9SJohannes Doerfert return __t; 117d999cbc9SJohannes Doerfert} 118d999cbc9SJohannes Doerfert 119d999cbc9SJohannes Doerferttemplate <class _Tp> 120d999cbc9SJohannes Doerfertinline complex<_Tp> 121d999cbc9SJohannes Doerfertoperator-(const complex<_Tp> &__x, const _Tp &__y) { 122d999cbc9SJohannes Doerfert complex<_Tp> __t(__x); 123d999cbc9SJohannes Doerfert __t -= __y; 124d999cbc9SJohannes Doerfert return __t; 125d999cbc9SJohannes Doerfert} 126d999cbc9SJohannes Doerfert 127d999cbc9SJohannes Doerferttemplate <class _Tp> 128d999cbc9SJohannes Doerfertinline complex<_Tp> 129d999cbc9SJohannes Doerfertoperator-(const _Tp &__x, const complex<_Tp> &__y) { 130d999cbc9SJohannes Doerfert complex<_Tp> __t(-__y); 131d999cbc9SJohannes Doerfert __t += __x; 132d999cbc9SJohannes Doerfert return __t; 133d999cbc9SJohannes Doerfert} 134d999cbc9SJohannes Doerfert 135d999cbc9SJohannes Doerferttemplate <class _Tp> 136d999cbc9SJohannes Doerfertcomplex<_Tp> 137d999cbc9SJohannes Doerfertoperator*(const complex<_Tp> &__z, const complex<_Tp> &__w) { 138d999cbc9SJohannes Doerfert _Tp __a = __z.real(); 139d999cbc9SJohannes Doerfert _Tp __b = __z.imag(); 140d999cbc9SJohannes Doerfert _Tp __c = __w.real(); 141d999cbc9SJohannes Doerfert _Tp __d = __w.imag(); 142d999cbc9SJohannes Doerfert _Tp __ac = __a * __c; 143d999cbc9SJohannes Doerfert _Tp __bd = __b * __d; 144d999cbc9SJohannes Doerfert _Tp __ad = __a * __d; 145d999cbc9SJohannes Doerfert _Tp __bc = __b * __c; 146d999cbc9SJohannes Doerfert _Tp __x = __ac - __bd; 147d999cbc9SJohannes Doerfert _Tp __y = __ad + __bc; 148d999cbc9SJohannes Doerfert if (std::isnan(__x) && std::isnan(__y)) { 149d999cbc9SJohannes Doerfert bool __recalc = false; 150d999cbc9SJohannes Doerfert if (std::isinf(__a) || std::isinf(__b)) { 151d999cbc9SJohannes Doerfert __a = copysign(std::isinf(__a) ? _Tp(1) : _Tp(0), __a); 152d999cbc9SJohannes Doerfert __b = copysign(std::isinf(__b) ? _Tp(1) : _Tp(0), __b); 153d999cbc9SJohannes Doerfert if (std::isnan(__c)) 154d999cbc9SJohannes Doerfert __c = copysign(_Tp(0), __c); 155d999cbc9SJohannes Doerfert if (std::isnan(__d)) 156d999cbc9SJohannes Doerfert __d = copysign(_Tp(0), __d); 157d999cbc9SJohannes Doerfert __recalc = true; 158d999cbc9SJohannes Doerfert } 159d999cbc9SJohannes Doerfert if (std::isinf(__c) || std::isinf(__d)) { 160d999cbc9SJohannes Doerfert __c = copysign(std::isinf(__c) ? _Tp(1) : _Tp(0), __c); 161d999cbc9SJohannes Doerfert __d = copysign(std::isinf(__d) ? _Tp(1) : _Tp(0), __d); 162d999cbc9SJohannes Doerfert if (std::isnan(__a)) 163d999cbc9SJohannes Doerfert __a = copysign(_Tp(0), __a); 164d999cbc9SJohannes Doerfert if (std::isnan(__b)) 165d999cbc9SJohannes Doerfert __b = copysign(_Tp(0), __b); 166d999cbc9SJohannes Doerfert __recalc = true; 167d999cbc9SJohannes Doerfert } 168d999cbc9SJohannes Doerfert if (!__recalc && (std::isinf(__ac) || std::isinf(__bd) || 169d999cbc9SJohannes Doerfert std::isinf(__ad) || std::isinf(__bc))) { 170d999cbc9SJohannes Doerfert if (std::isnan(__a)) 171d999cbc9SJohannes Doerfert __a = copysign(_Tp(0), __a); 172d999cbc9SJohannes Doerfert if (std::isnan(__b)) 173d999cbc9SJohannes Doerfert __b = copysign(_Tp(0), __b); 174d999cbc9SJohannes Doerfert if (std::isnan(__c)) 175d999cbc9SJohannes Doerfert __c = copysign(_Tp(0), __c); 176d999cbc9SJohannes Doerfert if (std::isnan(__d)) 177d999cbc9SJohannes Doerfert __d = copysign(_Tp(0), __d); 178d999cbc9SJohannes Doerfert __recalc = true; 179d999cbc9SJohannes Doerfert } 180d999cbc9SJohannes Doerfert if (__recalc) { 181d999cbc9SJohannes Doerfert __x = _Tp(INFINITY) * (__a * __c - __b * __d); 182d999cbc9SJohannes Doerfert __y = _Tp(INFINITY) * (__a * __d + __b * __c); 183d999cbc9SJohannes Doerfert } 184d999cbc9SJohannes Doerfert } 185d999cbc9SJohannes Doerfert return complex<_Tp>(__x, __y); 186d999cbc9SJohannes Doerfert} 187d999cbc9SJohannes Doerfert 188d999cbc9SJohannes Doerferttemplate <class _Tp> 189d999cbc9SJohannes Doerfertinline complex<_Tp> 190d999cbc9SJohannes Doerfertoperator*(const complex<_Tp> &__x, const _Tp &__y) { 191d999cbc9SJohannes Doerfert complex<_Tp> __t(__x); 192d999cbc9SJohannes Doerfert __t *= __y; 193d999cbc9SJohannes Doerfert return __t; 194d999cbc9SJohannes Doerfert} 195d999cbc9SJohannes Doerfert 196d999cbc9SJohannes Doerferttemplate <class _Tp> 197d999cbc9SJohannes Doerfertinline complex<_Tp> 198d999cbc9SJohannes Doerfertoperator*(const _Tp &__x, const complex<_Tp> &__y) { 199d999cbc9SJohannes Doerfert complex<_Tp> __t(__y); 200d999cbc9SJohannes Doerfert __t *= __x; 201d999cbc9SJohannes Doerfert return __t; 202d999cbc9SJohannes Doerfert} 203d999cbc9SJohannes Doerfert 204d999cbc9SJohannes Doerferttemplate <class _Tp> 205d999cbc9SJohannes Doerfertcomplex<_Tp> 206d999cbc9SJohannes Doerfertoperator/(const complex<_Tp> &__z, const complex<_Tp> &__w) { 207d999cbc9SJohannes Doerfert int __ilogbw = 0; 208d999cbc9SJohannes Doerfert _Tp __a = __z.real(); 209d999cbc9SJohannes Doerfert _Tp __b = __z.imag(); 210d999cbc9SJohannes Doerfert _Tp __c = __w.real(); 211d999cbc9SJohannes Doerfert _Tp __d = __w.imag(); 212d999cbc9SJohannes Doerfert _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); 213d999cbc9SJohannes Doerfert if (std::isfinite(__logbw)) { 214d999cbc9SJohannes Doerfert __ilogbw = static_cast<int>(__logbw); 215d999cbc9SJohannes Doerfert __c = scalbn(__c, -__ilogbw); 216d999cbc9SJohannes Doerfert __d = scalbn(__d, -__ilogbw); 217d999cbc9SJohannes Doerfert } 218d999cbc9SJohannes Doerfert _Tp __denom = __c * __c + __d * __d; 219d999cbc9SJohannes Doerfert _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); 220d999cbc9SJohannes Doerfert _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); 221d999cbc9SJohannes Doerfert if (std::isnan(__x) && std::isnan(__y)) { 222d999cbc9SJohannes Doerfert if ((__denom == _Tp(0)) && (!std::isnan(__a) || !std::isnan(__b))) { 223d999cbc9SJohannes Doerfert __x = copysign(_Tp(INFINITY), __c) * __a; 224d999cbc9SJohannes Doerfert __y = copysign(_Tp(INFINITY), __c) * __b; 225d999cbc9SJohannes Doerfert } else if ((std::isinf(__a) || std::isinf(__b)) && std::isfinite(__c) && std::isfinite(__d)) { 226d999cbc9SJohannes Doerfert __a = copysign(std::isinf(__a) ? _Tp(1) : _Tp(0), __a); 227d999cbc9SJohannes Doerfert __b = copysign(std::isinf(__b) ? _Tp(1) : _Tp(0), __b); 228d999cbc9SJohannes Doerfert __x = _Tp(INFINITY) * (__a * __c + __b * __d); 229d999cbc9SJohannes Doerfert __y = _Tp(INFINITY) * (__b * __c - __a * __d); 230d999cbc9SJohannes Doerfert } else if (std::isinf(__logbw) && __logbw > _Tp(0) && std::isfinite(__a) && std::isfinite(__b)) { 231d999cbc9SJohannes Doerfert __c = copysign(std::isinf(__c) ? _Tp(1) : _Tp(0), __c); 232d999cbc9SJohannes Doerfert __d = copysign(std::isinf(__d) ? _Tp(1) : _Tp(0), __d); 233d999cbc9SJohannes Doerfert __x = _Tp(0) * (__a * __c + __b * __d); 234d999cbc9SJohannes Doerfert __y = _Tp(0) * (__b * __c - __a * __d); 235d999cbc9SJohannes Doerfert } 236d999cbc9SJohannes Doerfert } 237d999cbc9SJohannes Doerfert return complex<_Tp>(__x, __y); 238d999cbc9SJohannes Doerfert} 239d999cbc9SJohannes Doerfert 240d999cbc9SJohannes Doerferttemplate <class _Tp> 241d999cbc9SJohannes Doerfertinline complex<_Tp> 242d999cbc9SJohannes Doerfertoperator/(const complex<_Tp> &__x, const _Tp &__y) { 243d999cbc9SJohannes Doerfert return complex<_Tp>(__x.real() / __y, __x.imag() / __y); 244d999cbc9SJohannes Doerfert} 245d999cbc9SJohannes Doerfert 246d999cbc9SJohannes Doerferttemplate <class _Tp> 247d999cbc9SJohannes Doerfertinline complex<_Tp> 248d999cbc9SJohannes Doerfertoperator/(const _Tp &__x, const complex<_Tp> &__y) { 249d999cbc9SJohannes Doerfert complex<_Tp> __t(__x); 250d999cbc9SJohannes Doerfert __t /= __y; 251d999cbc9SJohannes Doerfert return __t; 252d999cbc9SJohannes Doerfert} 253d999cbc9SJohannes Doerfert 254d999cbc9SJohannes Doerferttemplate <class _Tp> 255d999cbc9SJohannes Doerfertinline complex<_Tp> 256d999cbc9SJohannes Doerfertoperator+(const complex<_Tp> &__x) { 257d999cbc9SJohannes Doerfert return __x; 258d999cbc9SJohannes Doerfert} 259d999cbc9SJohannes Doerfert 260d999cbc9SJohannes Doerferttemplate <class _Tp> 261d999cbc9SJohannes Doerfertinline complex<_Tp> 262d999cbc9SJohannes Doerfertoperator-(const complex<_Tp> &__x) { 263d999cbc9SJohannes Doerfert return complex<_Tp>(-__x.real(), -__x.imag()); 264d999cbc9SJohannes Doerfert} 265d999cbc9SJohannes Doerfert 266d999cbc9SJohannes Doerferttemplate <class _Tp> 267d999cbc9SJohannes Doerfertinline bool 268d999cbc9SJohannes Doerfertoperator==(const complex<_Tp> &__x, const complex<_Tp> &__y) { 269d999cbc9SJohannes Doerfert return __x.real() == __y.real() && __x.imag() == __y.imag(); 270d999cbc9SJohannes Doerfert} 271d999cbc9SJohannes Doerfert 272d999cbc9SJohannes Doerferttemplate <class _Tp> 273d999cbc9SJohannes Doerfertinline bool 274d999cbc9SJohannes Doerfertoperator==(const complex<_Tp> &__x, const _Tp &__y) { 275d999cbc9SJohannes Doerfert return __x.real() == __y && __x.imag() == 0; 276d999cbc9SJohannes Doerfert} 277d999cbc9SJohannes Doerfert 278d999cbc9SJohannes Doerferttemplate <class _Tp> 279d999cbc9SJohannes Doerfertinline bool 280d999cbc9SJohannes Doerfertoperator==(const _Tp &__x, const complex<_Tp> &__y) { 281d999cbc9SJohannes Doerfert return __x == __y.real() && 0 == __y.imag(); 282d999cbc9SJohannes Doerfert} 283d999cbc9SJohannes Doerfert 284d999cbc9SJohannes Doerferttemplate <class _Tp> 285d999cbc9SJohannes Doerfertinline bool 286d999cbc9SJohannes Doerfertoperator!=(const complex<_Tp> &__x, const complex<_Tp> &__y) { 287d999cbc9SJohannes Doerfert return !(__x == __y); 288d999cbc9SJohannes Doerfert} 289d999cbc9SJohannes Doerfert 290d999cbc9SJohannes Doerferttemplate <class _Tp> 291d999cbc9SJohannes Doerfertinline bool 292d999cbc9SJohannes Doerfertoperator!=(const complex<_Tp> &__x, const _Tp &__y) { 293d999cbc9SJohannes Doerfert return !(__x == __y); 294d999cbc9SJohannes Doerfert} 295d999cbc9SJohannes Doerfert 296d999cbc9SJohannes Doerferttemplate <class _Tp> 297d999cbc9SJohannes Doerfertinline bool 298d999cbc9SJohannes Doerfertoperator!=(const _Tp &__x, const complex<_Tp> &__y) { 299d999cbc9SJohannes Doerfert return !(__x == __y); 300d999cbc9SJohannes Doerfert} 301d999cbc9SJohannes Doerfert 302*56069b5cSJohannes Doerferttemplate <class _Tp> _Tp abs(const std::complex<_Tp> &__c); 303*56069b5cSJohannes Doerfert 304*56069b5cSJohannes Doerfert// arg 305*56069b5cSJohannes Doerfert 306*56069b5cSJohannes Doerferttemplate <class _Tp> _Tp arg(const std::complex<_Tp> &__c); 307*56069b5cSJohannes Doerfert 308*56069b5cSJohannes Doerfert// norm 309*56069b5cSJohannes Doerfert 310*56069b5cSJohannes Doerferttemplate <class _Tp> _Tp norm(const std::complex<_Tp> &__c); 311*56069b5cSJohannes Doerfert 312*56069b5cSJohannes Doerfert// conj 313*56069b5cSJohannes Doerfert 314*56069b5cSJohannes Doerferttemplate <class _Tp> std::complex<_Tp> conj(const std::complex<_Tp> &__c); 315*56069b5cSJohannes Doerfert 316*56069b5cSJohannes Doerfert// proj 317*56069b5cSJohannes Doerfert 318*56069b5cSJohannes Doerferttemplate <class _Tp> std::complex<_Tp> proj(const std::complex<_Tp> &__c); 319*56069b5cSJohannes Doerfert 320*56069b5cSJohannes Doerfert// polar 321*56069b5cSJohannes Doerfert 322*56069b5cSJohannes Doerferttemplate <class _Tp> 323*56069b5cSJohannes Doerfertcomplex<_Tp> polar(const _Tp &__rho, const _Tp &__theta = _Tp()); 324*56069b5cSJohannes Doerfert 325*56069b5cSJohannes Doerfert// log 326*56069b5cSJohannes Doerfert 327*56069b5cSJohannes Doerferttemplate <class _Tp> std::complex<_Tp> log(const std::complex<_Tp> &__x); 328*56069b5cSJohannes Doerfert 329*56069b5cSJohannes Doerfert// log10 330*56069b5cSJohannes Doerfert 331*56069b5cSJohannes Doerferttemplate <class _Tp> std::complex<_Tp> log10(const std::complex<_Tp> &__x); 332*56069b5cSJohannes Doerfert 333*56069b5cSJohannes Doerfert// sqrt 334*56069b5cSJohannes Doerfert 335*56069b5cSJohannes Doerferttemplate <class _Tp> 336*56069b5cSJohannes Doerfertstd::complex<_Tp> sqrt(const std::complex<_Tp> &__x); 337*56069b5cSJohannes Doerfert 338*56069b5cSJohannes Doerfert// exp 339*56069b5cSJohannes Doerfert 340*56069b5cSJohannes Doerferttemplate <class _Tp> 341*56069b5cSJohannes Doerfertstd::complex<_Tp> exp(const std::complex<_Tp> &__x); 342*56069b5cSJohannes Doerfert 343*56069b5cSJohannes Doerfert// pow 344*56069b5cSJohannes Doerfert 345*56069b5cSJohannes Doerferttemplate <class _Tp> 346*56069b5cSJohannes Doerfertstd::complex<_Tp> pow(const std::complex<_Tp> &__x, 347*56069b5cSJohannes Doerfert const std::complex<_Tp> &__y); 348*56069b5cSJohannes Doerfert 349*56069b5cSJohannes Doerfert// __sqr, computes pow(x, 2) 350*56069b5cSJohannes Doerfert 351*56069b5cSJohannes Doerferttemplate <class _Tp> std::complex<_Tp> __sqr(const std::complex<_Tp> &__x); 352*56069b5cSJohannes Doerfert 353*56069b5cSJohannes Doerfert// asinh 354*56069b5cSJohannes Doerfert 355*56069b5cSJohannes Doerferttemplate <class _Tp> 356*56069b5cSJohannes Doerfertstd::complex<_Tp> asinh(const std::complex<_Tp> &__x); 357*56069b5cSJohannes Doerfert 358*56069b5cSJohannes Doerfert// acosh 359*56069b5cSJohannes Doerfert 360*56069b5cSJohannes Doerferttemplate <class _Tp> 361*56069b5cSJohannes Doerfertstd::complex<_Tp> acosh(const std::complex<_Tp> &__x); 362*56069b5cSJohannes Doerfert 363*56069b5cSJohannes Doerfert// atanh 364*56069b5cSJohannes Doerfert 365*56069b5cSJohannes Doerferttemplate <class _Tp> 366*56069b5cSJohannes Doerfertstd::complex<_Tp> atanh(const std::complex<_Tp> &__x); 367*56069b5cSJohannes Doerfert 368*56069b5cSJohannes Doerfert// sinh 369*56069b5cSJohannes Doerfert 370*56069b5cSJohannes Doerferttemplate <class _Tp> 371*56069b5cSJohannes Doerfertstd::complex<_Tp> sinh(const std::complex<_Tp> &__x); 372*56069b5cSJohannes Doerfert 373*56069b5cSJohannes Doerfert// cosh 374*56069b5cSJohannes Doerfert 375*56069b5cSJohannes Doerferttemplate <class _Tp> 376*56069b5cSJohannes Doerfertstd::complex<_Tp> cosh(const std::complex<_Tp> &__x); 377*56069b5cSJohannes Doerfert 378*56069b5cSJohannes Doerfert// tanh 379*56069b5cSJohannes Doerfert 380*56069b5cSJohannes Doerferttemplate <class _Tp> 381*56069b5cSJohannes Doerfertstd::complex<_Tp> tanh(const std::complex<_Tp> &__x); 382*56069b5cSJohannes Doerfert 383*56069b5cSJohannes Doerfert// asin 384*56069b5cSJohannes Doerfert 385*56069b5cSJohannes Doerferttemplate <class _Tp> 386*56069b5cSJohannes Doerfertstd::complex<_Tp> asin(const std::complex<_Tp> &__x); 387*56069b5cSJohannes Doerfert 388*56069b5cSJohannes Doerfert// acos 389*56069b5cSJohannes Doerfert 390*56069b5cSJohannes Doerferttemplate <class _Tp> 391*56069b5cSJohannes Doerfertstd::complex<_Tp> acos(const std::complex<_Tp> &__x); 392*56069b5cSJohannes Doerfert 393*56069b5cSJohannes Doerfert// atan 394*56069b5cSJohannes Doerfert 395*56069b5cSJohannes Doerferttemplate <class _Tp> 396*56069b5cSJohannes Doerfertstd::complex<_Tp> atan(const std::complex<_Tp> &__x); 397*56069b5cSJohannes Doerfert 398*56069b5cSJohannes Doerfert// sin 399*56069b5cSJohannes Doerfert 400*56069b5cSJohannes Doerferttemplate <class _Tp> 401*56069b5cSJohannes Doerfertstd::complex<_Tp> sin(const std::complex<_Tp> &__x); 402*56069b5cSJohannes Doerfert 403*56069b5cSJohannes Doerfert// cos 404*56069b5cSJohannes Doerfert 405*56069b5cSJohannes Doerferttemplate <class _Tp> std::complex<_Tp> cos(const std::complex<_Tp> &__x); 406*56069b5cSJohannes Doerfert 407*56069b5cSJohannes Doerfert// tan 408*56069b5cSJohannes Doerfert 409*56069b5cSJohannes Doerferttemplate <class _Tp> 410*56069b5cSJohannes Doerfertstd::complex<_Tp> tan(const std::complex<_Tp> &__x); 411*56069b5cSJohannes Doerfert 412d999cbc9SJohannes Doerfert} // namespace std 413