cplx.c


/*
** CPLX.C
** A collection of complex number routines.
**
**	struct Complex C_add (struct Complex a, struct Complex b)
**	struct Complex C_sub (struct Complex a, struct Complex b)
**	struct Complex C_mul (struct Complex a, struct Complex b)
**	struct Complex C_div (struct Complex a, struct Complex b)
**	struct Complex C_para (struct Complex a, struct Complex b)
**	   return sum, difference, product, quotient or parallel
**	   of complex quantities a and b.
**
**	struct Complex C_conj (struct Complex a)
**	struct Complex C_inv (struct Complex a)
**	   return complex conj or invert of complex quantity a
**
**	float C_mag (struct Complex a)
**	float C_ang (struct Complex a)
**	   return mag or angle (in rads) of complex quantity a
**
** copyright P. H. Anderson, Morgan State University, 5 May 96
*/

#include <stdio.h>
#include <math.h>

struct Complex
{
   float r;  /*real part*/
   float i;  /*imag part*/
};

struct Complex C_conj (struct Complex a)
{
   struct Complex result;
   result.r = a.r;
   result.i = -a.i;
   return(result);
}

struct Complex C_add (struct Complex a, struct Complex b)
{
   struct Complex result;
   result.r = a.r + b.r;
   result.i = a.i + b.i;
   return(result);
}

struct Complex C_sub (struct Complex a, struct Complex b)
{
   struct Complex result;
   result.r = a.r - b.r;
   result.i = a.i - b.i;
   return(result);
}

struct Complex C_mul (struct Complex a, struct Complex b)
{
   struct Complex result;
   result.r = a.r*b.r - a.i*b.i;
   result.i = a.r*b.i + b.r*a.i;
   return(result);
}

struct Complex C_div (struct Complex a, struct Complex b)
{
   struct Complex c, result, num;
   float denom;

   c = C_conj(b);
   num = C_mul (a, c);
   denom = b.r*b.r + b.i*b.i + 1.2e-63;  /*to prevent division by zero*/

   result.r = num.r / denom;
   result.i = num.i / denom;
   return(result);
}

struct Complex C_para (struct Complex a, struct Complex b)
{
   struct Complex result, num, denom;

   num = C_mul (a, b);
   denom = C_add(a, b);

   result = C_div (num, denom);
   return(result);
}

struct Complex C_inv (struct Complex a)
{
   struct Complex result, num;
   num.r = 1.0;
   num.i = 0.0;
   result = C_div (num, a);
   return(result);
}

 float C_ang (struct Complex a)
 {
    float result;
    result = (float) atan2 ((double) a.i, (double) a.r + 1e-99);
    /* Note that 1e-99 is added to avoid computing the atan of
    ** 90 degrees
    */
    return (result);
 }

 float C_mag (struct Complex a)
 {
    float result;
    result = (float) sqrt ( (double) (a.r*a.r + a.i*a.i));
    return (result);
 }