Next: The Void Type, Previous: Floating-Point Data Types, Up: Primitive Data Types [Contents][Index]
Complex numbers can include both a real part and an imaginary part. The numeric constants covered above have real-numbered values. An imaginary-valued constant is an ordinary real-valued constant followed by ‘i’.
To declare numeric variables as complex, use the _Complex
keyword.4 The
standard C complex data types are floating point,
_Complex float foo; _Complex double bar; _Complex long double quux;
but GNU C supports integer complex types as well.
Since _Complex is a keyword just like float and
double and long, the keywords can appear in any order,
but the order shown above seems most logical.
GNU C supports constants for complex values; for instance, 4.0 +
3.0i has the value 4 + 3i as type _Complex double.
See Imaginary Constants.
To pull the real and imaginary parts of the number back out, GNU C
provides the keywords __real__ and __imag__:
_Complex double foo = 4.0 + 3.0i; double a = __real__ foo; /*ais now 4.0. */ double b = __imag__ foo; /*bis now 3.0. */
Standard C does not include these keywords, and instead relies on
functions defined in complex.h for accessing the real and
imaginary parts of a complex number: crealf, creal, and
creall extract the real part of a float, double, or long double
complex number, respectively; cimagf, cimag, and
cimagl extract the imaginary part.
GNU C also defines ‘~’ as an operator for complex conjugation, which means negating the imaginary part of a complex number:
_Complex double foo = 4.0 + 3.0i;
_Complex double bar = ~foo; /* bar is now 4 - 3i. */
For standard C compatibility, you can use the appropriate library
function: conjf, conj, or confl.
For compatibility with older versions of GNU C, the
keyword __complex__ is also allowed. Going forward, however,
use the new _Complex keyword as defined in ISO C11.
Next: The Void Type, Previous: Floating-Point Data Types, Up: Primitive Data Types [Contents][Index]