/* Macros for complex arithmetic and for input/output of complex numbers. */ struct complex { double real; double imag; }; static double _abs_sq; /* c = a + b */ #define add_c( c, a, b ) ( \ c.real = a.real + b.real, \ c.imag = a.imag + b.imag ) /* c = a - b */ #define sub_c( c, a, b ) ( \ c.real = a.real - b.real, \ c.imag = a.imag - b.imag ) /* c = a * b */ #define mul_c( c, a, b ) ( \ c.real = a.real * b.real - a.imag * b.imag, \ c.imag = a.imag * b.real + a.real * b.imag ) /* c = a / b */ #define div_c( c, a, b ) ( \ _abs_sq = b.real * b.real + b.imag * b.imag, \ c.real = ( a.real * b.real + a.imag * b.imag ) / _abs_sq, \ c.imag = ( a.imag * b.real - a.real * b.imag ) / _abs_sq ) /* read a complex number from stdin */ #define read_c( c ) scanf( "%lf%lf", &c.real, &c.imag ) /* write a complex number to stdout */ #define print_c( c ) \ printf( "%f + %fI", c.real, c.imag )