ISO/ IEC JTC1/SC22/WG14 N818

 WG14/N818 J11/98-017
 
 Creating complex numbers.
 
 How to build a complex number in C9X (or what happens if an
 implementation supports NaNs and has I be of type float
 complex)?
 
 Note: in the following, treat <i> as an italic i, meaning
 the mathematical i for the sqrt(-1). 
 
 Currently, the draft suggests (page 257, footnote 188) that
 a complex number z should compare equal to creal(z) +
 cimag(z)*I; but this is not the same as saying a complex
 number can be built up from two reals, say x and y, by doing
 the expression: (x+y*I). For example, if I is defined to be
 of type complex (instead of type imaginary) and y is a NaN,
 (x+y*I) need not be the same as x+y*<i>. If I is of type
 complex (instead of imaginary), there is a problem. The
 problem is: I*NaN is NaN+NaN*<i>, instead of the expected
 0+NaN*<i>, so, the sum x+I*y ends up being NaN+NaN*<i>,
 instead of the expected x+NaN*<i>. 
 
 The draft states (6.1.2.5 Types, page 40) that the first
 element of complex is the real part and that the second
 element is the imaginary part and that complex have the
 alignment and representation as an array of two real
 elements. 
 
 Some proposed solutions:
 
 1) Allow access to the components of a complex variable (as
 if it were a structure with members re and im). That is,
 allow one to write:
 z.re = x;
 z.im = y;
 
 2) Allow access to the components of a complex variable (as
 if it were an array of two elements). That is, allow one to
 write:
 z[0] = x; or maybe z.[0] = x;
 z[1] = y; z.[1] = y;
 
 3) Create a macro of the form:
 z = CMPLX( x, y ); 
 to create a complex number from two real numbers and where
 it is understood that the first argument to the macro is the
 real component and the second argument is the imaginary
 component. 
 
 4) Define, by fiat, I*y to treat the real part as if it were
 (negative) zero, even if I is of type complex. We believe
 that this only matters if y is a NaN. The negative zero is
 required if directed rounding is supported and is the value
 required to have -0 + -0 be -0 in any rounding mode in IEC
 559. 
 
 5) Allow compound literals of the form:
 z = (double complex){ x, y };
 where it is understood that the first element of the
 compound literal is the real component and the second
 element is the imaginary component. The current C9X draft
 may already allow this in section (6.2.3.5 Compound
 Literals, pages 76-79). 
 
 6) Allow in initialization lists, pairs of numbers:
 double complex z = {x, y}; 
 to be used, as if a two element array (or a structure with
 two elements) were being initialized, with the first number
 being the real and the second number being the imaginary. 
 
 7) Do nothing.
 
 Any others?

AltStyle によって変換されたページ (->オリジナル) /