## Complex numbers

Complex numbers are represented using the type gsl_complex. The internal representation of this type may vary across platforms and should not be accessed directly. The functions and macros described below allow complex numbers to be manipulated in a portable way.

For reference, the default form of the gsl_complex type is given by the following struct,

typedef struct
{
double dat[2];
} gsl_complex;


The real and imaginary part are stored in contiguous elements of a two element array. This eliminates any padding between the real and imaginary parts, dat[0] and dat[1], allowing the struct to be mapped correctly onto packed complex arrays.

Function: gsl_complex gsl_complex_rect (double x, double y)
This function uses the rectangular cartesian components (x,y) to return the complex number @math{z = x + i y}.

Function: gsl_complex gsl_complex_polar (double r, double theta)
This function returns the complex number @math{z = r \exp(i \theta) = r (\cos(\theta) + i \sin(\theta))} from the polar representation (r,theta).

Macro: GSL_REAL (z)
Macro: GSL_IMAG (z)
These macros return the real and imaginary parts of the complex number z.

Macro: GSL_SET_COMPLEX (zp, x, y)
This macro uses the cartesian components (x,y) to set the real and imaginary parts of the complex number pointed to by zp. For example,

GSL_SET_COMPLEX(&z, 3, 4)


sets z to be @math{3 + 4i}.

Macro: GSL_SET_REAL (zp,x)
Macro: GSL_SET_IMAG (zp,y)
These macros allow the real and imaginary parts of the complex number pointed to by zp to be set independently.