#ifndef COMPLEX_H #define COMPLEX_H #include typedef struct { double re; double im; } complex_t; static inline complex_t complex_mul (complex_t a, complex_t b) { complex_t r; r.re = a.re * b.re - a.im * b.im; r.im = a.re * b.im + a.im * b.re; return r; } static inline complex_t complex_smul (complex_t a, double s) { a.re *= s; a.im *= s; return a; } static inline complex_t complex_add (complex_t a, complex_t b) { complex_t r; r.re = a.re + b.re; r.im = a.im + b.im; return r; } static inline complex_t complex_sub (complex_t a, complex_t b) { complex_t r; r.re = a.re - b.re; r.im = a.im - b.im; return r; } static inline double complex_mag (complex_t a) { return sqrt (a.re * a.re + a.im * a.im); } static inline double complex_arg (complex_t a) { return fmod (atan2 (a.im, a.re) + 2 * M_PI, 2 * M_PI); } static inline complex_t complex_from_mag_arg (double mag, double arg) { complex_t r; r.re = mag * cos (arg); r.im = mag * sin (arg); return r; } #endif