/* complex.c */
#include <stdio.h>
#include <math.h>
#include "complex.h"


/*
 * Set a complex number to re + im * i.
 */
void setComplex(Complex *z, double re, double im) {
  z->re = re;
  z->im = im;
}



/*
 * Copy the complex *source to *dest.
 */
void copyComplex(Complex *dest, Complex *source) {
  dest->re = source->re;
  dest->im = source->im;
}



/*
 * Print the complex re + im * i.
 */
void printComplex(Complex *z) {
  printf("%.2f %c %.2f * i", z->re, z->im < 0 ? '-' : '+', fabs(z->im));
}



/*
 * Add complex numbers: *dest = *dest + *source.
 */
void add(Complex *dest, Complex *source) {
  dest->re += source->re;
  dest->im += source->im;
}



/*
 * Subtract complex numbers: *dest = *dest - *source.
 */
void sub(Complex *dest, Complex *source) {
  dest->re -= source->re;
  dest->im -= source->im;
}



/*
 * Multiply complex numbers: *dest = *dest * *source
 */
void mult(Complex *dest, Complex *source) {
  double re;
  double im;

  re = dest->re * source->re - dest->im * source->im;
  im = dest->im * source->re + dest->re * source->im;
  dest->re = re;
  dest->im = im;
}



/*
 * Conjugate complex numbers: *dest = /(*dest)
 */
void conj(Complex *destination) {
  double re;
  double im;
  destination->im = -destination->im;
}



/*
 * Divide complex numbers: *dest = *dest / *source
 */
void div(Complex *dest, Complex *source) {
  double re;
  double im;
  double denominator;
  denominator = source->re * source->re + source->im * source->im;
  re = (dest->re * source->im + dest->im * source->re) / denominator;
  im = (dest->im * source->re - dest->re * source->im) / denominator;
  dest->re = re;
  dest->im = im;
}
