1// { dg-do run { xfail broken_cplxf_arg } } 2 3// Copyright (C) 2004 Free Software Foundation 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 2, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// 26.2.8 complex transcendentals 22 23#include <complex> 24#include <limits> 25#include <testsuite_hooks.h> 26 27template<typename T> 28 void test01_do(T a, T b) 29 { 30 using namespace std; 31 bool test __attribute__((unused)) = true; 32 typedef complex<T> cplx; 33 34 T eps = numeric_limits<T>::epsilon() * 100; 35 36 cplx ref = pow(cplx(a, T()), cplx(b, T())); 37 cplx res1 = pow(a, cplx(b, T())); 38 cplx res2 = pow(cplx(a, T()), b); 39 40 VERIFY( abs(ref - res1) < eps ); 41 VERIFY( abs(ref - res2) < eps ); 42 VERIFY( abs(res1 - res2) < eps ); 43 } 44 45// libstdc++/13450 46void test01() 47{ 48 float f1 = -1.0f; 49 float f2 = 0.5f; 50 test01_do(f1, f2); 51 52 f1 = -3.2f; 53 f2 = 1.4f; 54 test01_do(f1, f2); 55 56 double d1 = -1.0; 57 double d2 = 0.5; 58 test01_do(d1, d2); 59 60 d1 = -3.2; 61 d2 = 1.4; 62 test01_do(d1, d2); 63 64#if __LDBL_MANT_DIG__ != 106 65 /* For IBM long double, epsilon is too small (since 1.0 plus any 66 double is representable) to be able to expect results within 67 epsilon * 100 (which may be much less than 1ulp for a particular 68 long double value). */ 69 long double ld1 = -1.0l; 70 long double ld2 = 0.5l; 71 test01_do(ld1, ld2); 72 73 ld1 = -3.2l; 74 ld2 = 1.4l; 75 test01_do(ld1, ld2); 76#endif 77} 78 79int main() 80{ 81 test01(); 82 return 0; 83} 84