[Bug libstdc++/28406] New: What should be value of sqrt(complex<double>(-1.0,-0.0))?
mec at google dot com
gcc-bugzilla@gcc.gnu.org
Mon Jul 17 10:05:00 GMT 2006
Test program:
// Copyright 2006, Google Inc. All rights reserved.
// Author: mec@google.com (Michael Chastain)
//
// Compute i = sqrt(complex<double>(-1,-0))
#include <complex>
#include <iostream>
std::complex<double> d_m1(-1.0, -0.0);
int main() {
std::cout << "d_m1: " << d_m1 << std::endl;
std::complex<double> d_i_sqrt = std::sqrt(d_m1);
std::cout << "d_i_sqrt: " << d_i_sqrt << std::endl;
std::cout << std::endl;
return 0;
}
===
This gives different results with different versions of gcc. All of these are
with glibc 2.3.5, which is important because libstdc++ calls down to glibc
csqrt.
hollerith:~/exp-i$ /home/mec/gcc-3.4.6/install/bin/g++ z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,1)
hollerith:~/exp-i$ /home/mec/gcc-3.4.6/install/bin/g++ -O2 z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,1)
hollerith:~/exp-i$ /home/mec/gcc-4.0.2/install/bin/g++ z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,-1)
hollerith:~/exp-i$ /home/mec/gcc-4.0.2/install/bin/g++ -O2 z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,-1)
hollerith:~/exp-i$ /home/mec/gcc-4.1.1/install/bin/g++ z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,-1)
hollerith:~/exp-i$ /home/mec/gcc-4.1.1/install/bin/g++ -O2 z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,-1)
hollerith:~/exp-i$ /home/mec/gcc-4.2-20060624/install/bin/g++ z2.cc && a.out
d_m1: (-1,-0)
d_i_sqrt: (0,-1)
hollerith:~/exp-i$ /home/mec/gcc-4.2-20060624/install/bin/g++ -O2 z2.cc &&
a.out
d_m1: (-1,-0)
d_i_sqrt: (0,-1)
===
What is the correct value?
ISO/IEC 14882 says:
26.2.8 [lib.complex.transcendentals]
template<class T> complex<T> sqrt(const complex<T>& x);
-12- Notes: the branch cuts are along the negative real axis.
-13- Returns: the complex square root of x, in the range of the right
half-plane. If the argument is a negative real number, the value returned lies
on the positive imaginary axis.
ISO/EIC 9899:TC2 says:
7.3.3 Branch cuts
Some of the functions below have branch cuts, across which the function is
discontinuous. For implementations with a signed zero (including all IEC 60559
implementations) that follow the specifications of annex G, the sign of zero
distinguishes one side of a cut from another so the function is continuous
(except for format limitations) as the cut is approached from either side. For
example, for the square root function, which has a branch cut along the
negative real axis, the top of the cut, with imaginary part +0, maps to the
positive imaginary axis, and the bottom of the cut, with imaginary part 0, maps
to the negative imaginary axis.
And LIA-3, Draft ISO/IEC FCD 10967-3 First edition 2004-06-22, says:
sqrtC(F)(x+i.y) = conjC(F)(sqrtC(F)(x+i.0)) if x is in F u {-inf, +inf} and y =
-0
===
ISO/EIC 14882 appears to require the (-0,1) answer, because (-1,-0) is a
negative real number. Argh ... it depends ... on what "is" is.
LIA-3 is clear but I don't know the standards status of LIA-3.
--
Summary: What should be value of sqrt(complex<double>(-1.0,-
0.0))?
Product: gcc
Version: 4.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
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=28406
More information about the Gcc-bugs
mailing list