round-off error in std::pow(std::complex<T>, double) in C++11
Jordi Gutiérrez Hermoso
jordigh@octave.org
Wed Jan 23 15:07:00 GMT 2013
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.
More information about the Libstdc++
mailing list