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:
parent
ecc7568da6
commit
52ddaf41bf
5 changed files with 92 additions and 7 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
75
libstdc++-v3/testsuite/26_numerics/complex/13450.cc
Normal file
75
libstdc++-v3/testsuite/26_numerics/complex/13450.cc
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue