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
This commit is contained in:
Paul Kienzle 2004-03-10 09:16:12 +00:00 committed by Paolo Carlini
parent ecc7568da6
commit 52ddaf41bf
5 changed files with 92 additions and 7 deletions

View file

@ -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.

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}