This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

round-off error in std::pow(std::complex<T>, double) in C++11


Greetings, fellow GNU hackers.

Consider the following program,

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <complex>

    int main(){
      using namespace std;
      cout << setprecision(16) << pow(complex<double>(0,1), 2) << endl;
    }

Compile it with and without -std=c++0x:

    jordi@Iris:~$ g++ foo.c++ -o foo && ./foo
    (-1,0)

    jordi@Iris:~$ g++ foo.c++ -o foo -std=c++0x && ./foo
    (-1,1.224646799147353e-16)

The round-off error introduced by C++11 is partly due to the following
discussion:

    http://stackoverflow.com/questions/5627030/why-was-stdpowdouble-int-removed-from-c11

For some reason, the pow(complex<T>, int) overload seems to be
missing in C++11, but it doesn't seem like the standard says it should
be. Can it be restored in GNU libstdc++ for C++11?

We ran into this in GNU Octave when our test suite reported round-off
errors when compiling with C++11:

    https://savannah.gnu.org/bugs/?38142
    http://octave.1599824.n4.nabble.com/Welcome-C-11-td4647840.html#a4647903

Thanks,
- Jordi G. H.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]