aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaul Kienzle <pkienzle@nist.gov>2004-03-10 09:16:12 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2004-03-10 09:16:12 +0000
commit52ddaf41bf0dc7eea334b828e15be3f9e97f0d0f (patch)
tree4b71efb5adf002e92b61121c55148848d34fdc3f /libstdc++-v3
parentecc7568da6e6f2776c123b0021568d73a1ff0a03 (diff)
downloadgcc-52ddaf41bf0dc7eea334b828e15be3f9e97f0d0f.zip
gcc-52ddaf41bf0dc7eea334b828e15be3f9e97f0d0f.tar.gz
gcc-52ddaf41bf0dc7eea334b828e15be3f9e97f0d0f.tar.bz2
re PR libstdc++/13450 (std::pow(std::complex<double>(-1.,0.),0.5) yields (NaN,0))
2004-03-10 Paul Kienzle <pkienzle@nist.gov> Paolo Carlini <pcarlini@suse.de> PR libstdc++/13450 * include/std/std_complex.h (pow(const complex&, const _Tp&), pow(const _Tp&, const complex&)): Use cmath pow only when safe. * testsuite/26_numerics/complex/13450.cc: New. * testsuite/26_numerics/cmath/overloads.C: Rename to overloads.cc. * testsuite/26_numerics/complex/pow.C: Rename to pow.cc and fix. From-SVN: r79227
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/std/std_complex.h7
-rw-r--r--libstdc++-v3/testsuite/26_numerics/cmath/overloads.cc (renamed from libstdc++-v3/testsuite/26_numerics/cmath/overloads.C)0
-rw-r--r--libstdc++-v3/testsuite/26_numerics/complex/13450.cc75
-rw-r--r--libstdc++-v3/testsuite/26_numerics/complex/pow.cc (renamed from libstdc++-v3/testsuite/26_numerics/complex/pow.C)4
5 files changed, 92 insertions, 7 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index fa10cd9..265b25a 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,6 +1,17 @@
+2004-03-10 Paul Kienzle <pkienzle@nist.gov>
+ Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/13450
+ * include/std/std_complex.h (pow(const complex&, const _Tp&),
+ pow(const _Tp&, const complex&)): Use cmath pow only when safe.
+ * testsuite/26_numerics/complex/13450.cc: New.
+
+ * testsuite/26_numerics/cmath/overloads.C: Rename to overloads.cc.
+ * testsuite/26_numerics/complex/pow.C: Rename to pow.cc and fix.
+
2004-03-10 Jerry Quinn <jlquinn@optonline.net>
- PR 3247
+ PR libstdc++/3247
* include/bits/gslice_array.h (gslice_array()): Make public.
(operator=(gslice_array)): Make public. Implement.
* include/bits/indirect_array.h (indirect_array()): Make public.
diff --git a/libstdc++-v3/include/std/std_complex.h b/libstdc++-v3/include/std/std_complex.h
index 25c657f..d997867 100644
--- a/libstdc++-v3/include/std/std_complex.h
+++ b/libstdc++-v3/include/std/std_complex.h
@@ -705,7 +705,7 @@ namespace std
complex<_Tp>
pow(const complex<_Tp>& __x, const _Tp& __y)
{
- if (__x.imag() == _Tp())
+ if (__x.imag() == _Tp() && __x.real() > _Tp())
return pow(__x.real(), __y);
complex<_Tp> __t = log(__x);
@@ -723,9 +723,8 @@ namespace std
inline complex<_Tp>
pow(const _Tp& __x, const complex<_Tp>& __y)
{
- return __x == _Tp()
- ? _Tp()
- : std::polar(pow(__x, __y.real()), __y.imag() * log(__x));
+ return __x > _Tp() ? polar(pow(__x, __y.real()), __y.imag() * log(__x))
+ : pow(complex<_Tp>(__x, _Tp()), __y);
}
// 26.2.3 complex specializations
diff --git a/libstdc++-v3/testsuite/26_numerics/cmath/overloads.C b/libstdc++-v3/testsuite/26_numerics/cmath/overloads.cc
index 4d41a96..4d41a96 100644
--- a/libstdc++-v3/testsuite/26_numerics/cmath/overloads.C
+++ b/libstdc++-v3/testsuite/26_numerics/cmath/overloads.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/13450.cc b/libstdc++-v3/testsuite/26_numerics/complex/13450.cc
new file mode 100644
index 0000000..9df257d
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/complex/13450.cc
@@ -0,0 +1,75 @@
+// Copyright (C) 2004 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 26.2.8 complex transcendentals
+
+#include <complex>
+#include <limits>
+#include <testsuite_hooks.h>
+
+template<typename T>
+ void test01_do(T a, T b)
+ {
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+ typedef complex<T> cplx;
+
+ T eps = numeric_limits<T>::epsilon() * 10;
+
+ cplx ref = pow(cplx(a, T()), cplx(b, T()));
+ cplx res1 = pow(a, cplx(b, T()));
+ cplx res2 = pow(cplx(a, T()), b);
+
+ VERIFY( abs(ref - res1) < eps );
+ VERIFY( abs(ref - res2) < eps );
+ VERIFY( abs(res1 - res2) < eps );
+ }
+
+// libstdc++/13450
+void test01()
+{
+ float f1 = -1.0f;
+ float f2 = 0.5f;
+ test01_do(f1, f2);
+
+ f1 = -3.2f;
+ f2 = 1.4f;
+ test01_do(f1, f2);
+
+ double d1 = -1.0;
+ double d2 = 0.5;
+ test01_do(d1, d2);
+
+ d1 = -3.2;
+ d2 = 1.4;
+ test01_do(d1, d2);
+
+ long double ld1 = -1.0l;
+ long double ld2 = 0.5l;
+ test01_do(ld1, ld2);
+
+ ld1 = -3.2l;
+ ld2 = 1.4l;
+ test01_do(ld1, ld2);
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/pow.C b/libstdc++-v3/testsuite/26_numerics/complex/pow.cc
index c3f8479..58d0fc5 100644
--- a/libstdc++-v3/testsuite/26_numerics/complex/pow.C
+++ b/libstdc++-v3/testsuite/26_numerics/complex/pow.cc
@@ -6,9 +6,9 @@
int main()
{
- std::complex<double> z(0, 1) ;
+ std::complex<double> z;
- VERIFY(pow(z, 1.0/3.0) == 0.0);
+ VERIFY( pow(z, 1.0/3.0) == 0.0 );
return 0;
}