http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50957
Bug #: 50957 Summary: complex<T> ctor drops sign of zero (sometimes) Classification: Unclassified Product: gcc Version: 4.6.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: krec...@ginac.de When compiling with -std=c++0x (and only then), the ctor of g++ drops the sign of zero. (This sometimes devastates the correct choice of branch cuts in the complex plain.) Interestingly, it doesn't happen with my mock complex class. #include <iostream> #include <complex> using namespace std; template<typename _Tp> struct mock_complex { typedef _Tp value_type; _GLIBCXX_CONSTEXPR mock_complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp()) : _M_real(__r), _M_imag(__i) { } const _Tp real() const { return _M_real; } const _Tp imag() const { return _M_imag; } private: _Tp _M_real; _Tp _M_imag; }; int main() { mock_complex<double> z1(-0.0, 1.0); cout << signbit(z1.real()) << signbit(z1.imag()) << endl; // correct: 10 complex<double> z2(-0.0, 1.0); cout << signbit(z2.real()) << signbit(z2.imag()) << endl; // wrong: 00 }