138 lines
2.0 KiB
C
138 lines
2.0 KiB
C
#ifndef lint
|
|
static char sccsid[] = "@(#)complex.c 1.1 92/07/30 SMI";
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1988 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#include "complex.h"
|
|
|
|
_Fc_div(c, a, b)
|
|
complex *a, *b, *c;
|
|
{
|
|
register double ar, ai, br, bi;
|
|
register double den;
|
|
|
|
|
|
if (((*(int *) &(b->imag)) & 0x7fffffff) == 0) { /* Check for division by
|
|
* real. */
|
|
c->real = a->real / b->real;
|
|
c->imag = a->imag / b->real;
|
|
return;
|
|
}
|
|
br = b->real;
|
|
bi = b->imag;
|
|
ar = a->real;
|
|
ai = a->imag;
|
|
den = bi * bi + br * br;
|
|
c->real = (ar * br + ai * bi) / den;
|
|
c->imag = (ai * br - ar * bi) / den;
|
|
}
|
|
|
|
_Fc_mult(c, a, b)
|
|
complex *a, *b, *c;
|
|
{
|
|
c->real = (a->real * b->real) - (a->imag * b->imag);
|
|
c->imag = (a->real * b->imag) + (a->imag * b->real);
|
|
}
|
|
|
|
|
|
|
|
_Fc_minus(c, a, b)
|
|
complex *a, *b, *c;
|
|
{
|
|
c->real = a->real - b->real;
|
|
c->imag = a->imag - b->imag;
|
|
}
|
|
|
|
|
|
|
|
_Fc_add(c, a, b)
|
|
complex *a, *b, *c;
|
|
{
|
|
c->real = a->real + b->real;
|
|
c->imag = a->imag + b->imag;
|
|
}
|
|
|
|
|
|
|
|
_Fc_neg(c, a)
|
|
complex *c, *a;
|
|
{
|
|
c->real = -a->real;
|
|
c->imag = -a->imag;
|
|
}
|
|
|
|
/* Convert float to complex */
|
|
|
|
void
|
|
_Ff_conv_c(c, x)
|
|
complex *c;
|
|
FLOATPARAMETER x;
|
|
{
|
|
c->real = FLOATPARAMETERVALUE(x);
|
|
c->imag = 0.0;
|
|
}
|
|
|
|
/* Convert complex to float */
|
|
|
|
FLOATFUNCTIONTYPE
|
|
_Fc_conv_f(c)
|
|
complex *c;
|
|
{
|
|
RETURNFLOAT(c->real);
|
|
}
|
|
|
|
/* Convert complex to int */
|
|
|
|
int
|
|
_Fc_conv_i(c)
|
|
complex *c;
|
|
{
|
|
return (int) c->real;
|
|
}
|
|
|
|
/* Convert int to complex */
|
|
|
|
void
|
|
_Fi_conv_c(c, i)
|
|
complex *c;
|
|
int i;
|
|
{
|
|
c->real = (float) i;
|
|
c->imag = 0.0;
|
|
}
|
|
|
|
/* Convert complex to double */
|
|
|
|
double
|
|
_Fc_conv_d(c)
|
|
complex *c;
|
|
{
|
|
return (double) c->real;
|
|
}
|
|
|
|
|
|
/* Convert double to complex */
|
|
|
|
void
|
|
_Fd_conv_c(c, x)
|
|
complex *c;
|
|
double x;
|
|
{
|
|
c->real = (float) (x);
|
|
c->imag = 0.0;
|
|
}
|
|
|
|
/* Convert complex to double complex */
|
|
|
|
void
|
|
_Fc_conv_z(result, c)
|
|
dcomplex *result;
|
|
complex *c;
|
|
{
|
|
result->dreal = (double) c->real;
|
|
result->dimag = (double) c->imag;
|
|
}
|