This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: complex arithmetic in gcc (and various standards)


On Monday 02 October 2006 20:53, Gabriel Dos Reis wrote:
[...]
>
> | the result of the "same" multiplication considered as complex *
> | complex (vs complex * real) has a different sign for the zero
> | imaginary component.
>
> Thanks for the example.  I'm not sure this was anticipated by the C++
> specification.  I suspect I have to raise this on LWG.
>

Note that this problem also makes the two common complex initialisation 
strategies behave differently: in the second case below the sign of the 
imaginary part of z has disappeared:

#include <complex.h>
#include <stdio.h>

int main() {
  double complex z;
  double x=1.0;
  double y=-0.0;

  __real__ z = x;
  __imag__ z = y;
  printf("%e %e\n", creal(z), cimag(z));

  z = x + y*I;
  printf("%e %e\n", creal(z), cimag(z));

  return 0;
}

jan@gum15:../bessel $ gcc t16.c -O0 && ./a.out
1.000000e+00 -0.000000e+00
1.000000e+00 0.000000e+00

Another effect is that: when z==(1,-0.0), we get: creal(z) + cimag(z)*I = (1,
+0.0). Since 0==-0, formally this is not in conflict with footnote 166 on 
page 179 of ISO/IEC 9899:TC2, but well ... the standard is not too friendly 
for users of complex functions with branch cuts.

Regards,

	Jan.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]