[Bug libstdc++/89991] Complex numbers: Calculation of imaginary part is not correct
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Apr 8 10:18:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89991
--- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #5)
> The issue is
>
> std::pow<double> (__x=..., __y=@0x7fffffffdcb8: 0.5)
> at /home/space/rguenther/install/gcc-9.0/include/c++/9.0.1/complex:1027
> (gdb) l
> 1022 {
> 1023 #if ! _GLIBCXX_USE_C99_COMPLEX
> 1024 if (__x == _Tp())
> 1025 return _Tp();
> 1026 #endif
> 1027 if (__x.imag() == _Tp() && __x.real() > _Tp())
> 1028 return pow(__x.real(), __y);
>
> where __x.imag () == _Tp() says true for -0.0 == 0.0. This means
> std::pow will return the same values for r + -0.0i and r + 0.0i,
> not sure if that is allowed by the C++ standard.
But __x.real() > _Tp() is false here, so that branch isn't taken anyway.
Instead the pow(val, 0.5) result comes from:
_Complex double val = -1.8425031517782417e-07 + -0.0 * I;
_Complex double t = __builtin_clog(val);
double rho = exp(0.5 * __real__ t);
double theta = 0.5 * __imag__ t;
_Complex result = rho * cos(theta) + rho * sin(theta) * I;
__builtin_printf("%f\n", __imag__ result);
More information about the Gcc-bugs
mailing list