# include <stdio.h>
# include <math.h>
# include <string.h>
# include "complex.h"
# ifdef NEED_STRDUP
extern char *strdup ( );
# endif
double re(x)
complex x;
{
return x.r;
}
double im(x)
complex x;
{
return x.i;
}
complex negate(x)
complex x;
{
complex y;
y.r = -x.r;
y.i = -x.i;
return y;
}
complex recip(x)
complex x;
{
complex one;
one.r = 1.0;
one.i = 0.0;
return cdiv(one, x);
}
double modulus(x)
complex x;
{
return sqrt(x.r*x.r + x.i*x.i);
}
complex mult (x, y)
complex x;
complex y;
{
complex a;
a.r = x.r*y.r - x.i*y.i;
a.i = x.i*y.r + x.r*y.i;
return a;
}
complex add (x, y)
complex x;
complex y;
{
complex a;
a.r = x.r + y.r;
a.i = x.i + y.i;
return a;
}
complex sub (x, y)
complex x;
complex y;
{
complex a;
a.r = x.r - y.r;
a.i = x.i - y.i;
return a;
}
complex cdiv (x, y)
complex x;
complex y;
{
complex a;
double factor;
a = mult (x, conj (y));
factor = y.r*y.r + y.i*y.i;
a.r = a.r / factor;
a.i = a.i / factor;
return a;
}
complex csqrt (x)
complex x;
{
complex y;
double theta, radius;
radius = sqrt(x.r*x.r + x.i*x.i);
theta = atan2(x.i, x.r);
y.r = sqrt(radius)*cos(theta/2);
y.i = sqrt(radius)*sin(theta/2);
return y;
}
complex cexp (x)
double x;
{
complex y;
y.r = cos(x);
y.i = sin(x);
return y;
}
complex ccos (x)
complex x;
{
complex y;
y = scale(cexp(x.r), exp(-x.i)*0.5, 0.0);
y = add(y, scale(cexp(-x.r), exp(x.i)*0.5, 0.0));
return y;
}
complex csin (x)
complex x;
{
complex y;
complex i2;
i2.r = 0.0;
i2.i = 2;
y = scale(cexp(x.r), exp(-x.i), 0.0);
y = sub(y, scale(cexp(-x.r), exp(x.i), 0.0));
y = cdiv(y, i2);
return y;
}
complex conj (x)
complex x;
{
complex a;
a.r = x.r;
a.i = -x.i;
return a;
}
unsigned is_zero(x)
complex x;
{
return (x.r == 0 && x.i == 0);
}
complex zero()
{
complex x;
x.r = 0.0;
x.i = 0.0;
return x;
}
complex scale(x, factor, offset)
complex x;
double factor;
double offset;
{
complex y;
y.r = x.r * factor + offset;
y.i = x.i * factor + offset;
return y;
}
char *cprint (x)
complex x;
{
char buffer [32];
sprintf (buffer, "%7.5f %s %7.5fi ", x.r, (x.i < 0 ? "-" : "+"), fabs (x.i));
return strdup(buffer);
}
syntax highlighted by Code2HTML, v. 0.9.1