This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
round-off error in std::pow(std::complex<T>, double) in C++11
- From: Jordi GutiÃrrez Hermoso <jordigh at octave dot org>
- To: libstdc++ at gcc dot gnu dot org
- Cc: Octave Maintainers List <octave-maintainers at octave dot org>
- Date: Wed, 23 Jan 2013 10:07:03 -0500
- Subject: 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.