OSDN Git Service

PR libstdc++/10689
authorgdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 May 2003 06:52:11 +0000 (06:52 +0000)
committergdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 May 2003 06:52:11 +0000 (06:52 +0000)
* include/std/std_complex.h (pow): Tidy

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66989 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/std_complex.h
libstdc++-v3/testsuite/26_numerics/complex/pow.C [new file with mode: 0644]

index 6fc5fe7..6f3c110 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-20  Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+       PR libstdc++/10689
+       * include/std/std_complex.h (pow): Tidy.
+       
 2003-05-19  Paolo Carlini  <pcarlini@unitus.it>
 
        * testsuite/27_io/basic_filebuf/close/char/4.cc: New file, testing
index 87e4bcb..e943f5e 100644 (file)
@@ -565,24 +565,30 @@ namespace std
     }
 
   template<typename _Tp>
-    inline complex<_Tp>
+    complex<_Tp>
     pow(const complex<_Tp>& __x, const _Tp& __y)
     {
-      return exp(__y * log(__x));
+      if (__x.imag() == _Tp())
+        return pow(__x.real(), __y);
+
+      complex<_Tp> __t = log(__x);
+      return polar(exp(__y * __t.real()), __y * __t.imag());
     }
 
   template<typename _Tp>
     inline complex<_Tp>
     pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
     {
-      return exp(__y * log(__x));
+      return __x == _Tp() ? _Tp() : exp(__y * log(__x));
     }
 
   template<typename _Tp>
     inline complex<_Tp>
     pow(const _Tp& __x, const complex<_Tp>& __y)
     {
-      return exp(__y * log(__x));
+      return __x == _Tp()
+        ? _Tp()
+        : polar(pow(__x, __y.real()), __y.imag() * log(__x));
     }
 
   // 26.2.3  complex specializations
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/pow.C b/libstdc++-v3/testsuite/26_numerics/complex/pow.C
new file mode 100644 (file)
index 0000000..c3f8479
--- /dev/null
@@ -0,0 +1,14 @@
+// PR libbstdc++/10689
+// Origin: Daniel.Levine@jhuaph.edu
+
+#include <complex>
+#include <testsuite_hooks.h>
+
+int main()
+{
+   std::complex<double> z(0, 1) ;
+
+   VERIFY(pow(z, 1.0/3.0) == 0.0);
+
+   return 0;
+}