typedef struct cx_struct {
  double real;
  double imag;
} CX;

#define cx_add(z,x,y) \
  do { \
    (z).real = (x).real + (y).real; \
    (z).imag = (x).imag + (y).imag; \
  } while(0)

#define cx_sub(z,x,y) \
  do { \
    (z).real = (x).real - (y).real; \
    (z).imag = (x).imag - (y).imag; \
  } while(0)

#define cx_mul(z,x,y) \
  do { \
    (z).real = (x).real * (y).real - (x).imag * (y).imag; \
    (z).imag = (x).imag * (y).real + (x).real * (y).imag; \
  } while(0)

#define cx_div(z,x,y) \
  do { \
    (z).real = 1.0 / ((y).real * (y).real + (y).imag * (y).imag); \
    (z).imag = (z).real; \
    (z).real *= (x).real * (y).real + (x).imag * (y).imag; \
    (z).imag *= (x).imag * (y).real - (x).real * (y).imag; \
  } while(0)

#define cx_conj_mul(z,x,y) \
  do { \
    (z).real = (x).real * (y).real + (x).imag * (y).imag; \
    (z).imag = (x).imag * (y).real - (x).real * (y).imag; \
  } while(0)

#define cx_abs(x) \
  (sqrt((x).real*(x).real+(x).imag*(x).imag))

#define cx_scalar_mult(z, alpha, x) \
  do { \
    (z).real = alpha*(x).real; \
    (z).imag = alpha*(x).imag; \
  } while(0)

static CX CXZERO = { 0, 0 };
static CX CXONE = { 1, 0 };
static CX CXMONE = { -1, 0 };



syntax highlighted by Code2HTML, v. 0.9.1