summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-10 09:16:12 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-10 09:16:12 +0000
commitd892842736e25525d6013da2f0377f9b6a08ac8d (patch)
tree4b71efb5adf002e92b61121c55148848d34fdc3f /libstdc++-v3
parenta9ca39a06a57ccb6ba278bb32578401a64e75aa2 (diff)
downloadgcc-d892842736e25525d6013da2f0377f9b6a08ac8d.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79227 138bc75d-0d04-0410-961f-82ee72b054a4
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 fa10cd9af4b..265b25a3e71 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 25c657f2701..d997867c588 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 4d41a9640b4..4d41a9640b4 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 00000000000..9df257db599
--- /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 c3f8479828d..58d0fc5909b 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;
}