Test program: // Copyright 2006, Google Inc. All rights reserved. // Author: [EMAIL PROTECTED] (Michael Chastain) // // Compute (1.0, 0.0) *= -1.0
#include <complex> #include <iostream> std::complex<double> d_1(1.0, 0.0); int main() { std::complex<double> d_m1(1.0, 0.0); d_m1 *= -1.0; std::cout << "d_m1: " << d_m1 << std::endl; std::cout << std::endl; return 0; } === This gives different results with the same version of gcc at different optimization options. All of these are with glibc 2.3.5. hollerith:~/exp-i$ /home/mec/gcc-3.4.6/install/bin/g++ z4.cc && a.out d_m1: (-1,0) hollerith:~/exp-i$ /home/mec/gcc-3.4.6/install/bin/g++ -O2 z4.cc && a.out d_m1: (-1,0) hollerith:~/exp-i$ /fast/mec/gcc-4.0.3/install/bin/g++ z4.cc && a.out d_m1: (-1,0) hollerith:~/exp-i$ /fast/mec/gcc-4.0.3/install/bin/g++ -O2 z4.cc && a.out d_m1: (-1,0) hollerith:~/exp-i$ /home/mec/gcc-4.1.1/install/bin/g++ z4.cc && a.out d_m1: (-1,0) hollerith:~/exp-i$ /home/mec/gcc-4.1.1/install/bin/g++ -O2 z4.cc && a.out d_m1: (-1,-0) hollerith:~/exp-i$ /home/mec/gcc-4.2-20060624/install/bin/g++ z4.cc && a.out d_m1: (-1,0) hollerith:~/exp-i$ /home/mec/gcc-4.2-20060624/install/bin/g++ -O2 z4.cc && a.out d_m1: (-1,-0) === One might argue that (-1,0) is equals to (-1,-0). In that case, consider this code: std::complex<double> d_m1(1.0, 0.0); d_m1 *= -1.0; std::complex<double> d_i(sqrt(d_m1)); See PR 28406, which shows that sqrt((-1,0)) != sqrt((-1,-0)). So code like the above produces materially different results with gcc 4.1.1 -O0 and gcc 4.1.1 -O2. -- Summary: What should be value of complex<double>(1.0,0.0) *= -1? Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: mec at google dot com GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28408