summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/include/bits/std_complex.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/bits/std_complex.h')
-rw-r--r--libstdc++-v3/include/bits/std_complex.h28
1 files changed, 22 insertions, 6 deletions
diff --git a/libstdc++-v3/include/bits/std_complex.h b/libstdc++-v3/include/bits/std_complex.h
index 136ecb458f3..18e1b02b165 100644
--- a/libstdc++-v3/include/bits/std_complex.h
+++ b/libstdc++-v3/include/bits/std_complex.h
@@ -451,6 +451,28 @@ namespace std
}
template<typename _Tp>
+ complex<_Tp>
+ sqrt(const complex<_Tp>& __z)
+ {
+ _Tp __x = __z.real();
+ _Tp __y = __z.imag();
+
+ if (__x == _Tp())
+ {
+ _Tp __t = sqrt(abs(__y) / 2);
+ return complex<_Tp>(__t, __y < _Tp() ? -__t : __t);
+ }
+ else
+ {
+ _Tp __t = sqrt( 2 * abs(__z) + abs(__x));
+ _Tp __u = __t / 2;
+ return __x > _Tp()
+ ? complex<_Tp>(__u, __y / __t)
+ : complex<_Tp>(abs(__y) / __t, __y < _Tp() ? -__u : __u);
+ }
+ }
+
+ template<typename _Tp>
inline complex<_Tp>
tan(const complex<_Tp>& __z)
{
@@ -537,8 +559,6 @@ namespace std
friend class complex<double>;
friend class complex<long double>;
-
- friend complex<float> sqrt<>(const complex<float>&);
};
inline float
@@ -685,8 +705,6 @@ namespace std
friend class complex<float>;
friend class complex<long double>;
-
- friend complex<double> sqrt<>(const complex<double>&);
};
inline double
@@ -833,8 +851,6 @@ namespace std
friend class complex<float>;
friend class complex<double>;
-
- friend complex<long double> sqrt<>(const complex<long double>&);
};
inline
OpenPOWER on IntegriCloud