#ifndef lint
static	char sccsid[] = "@(#)zomplex.c 1.1 94/10/31 SMI";
#endif

/*
 * Copyright (c) 1987 by Sun Microsystems, Inc.
 */

# include "complex.h"

_Fz_div (c, a, b)
dcomplex *a, *b, *c;
{
	register double ar, ai, br, bi;
	register double ratio, den;

	br = b->dreal;
	bi = b->dimag;
	ar = a->dreal;
	ai = a->dimag;

	if (iszero(bi)) {
		c->dreal = ar / br;
		c->dimag = ai / br;
		return;
	}
	if (fabs(br) <= fabs(bi)) {
		ratio = br / bi;
		den = bi + br * ratio;
		c->dreal = (ar * ratio + ai) / den;
		c->dimag = (ai * ratio - ar) / den;
	} else {
		ratio = bi / br;
		den = br + bi * ratio;
		c->dreal = (ar + ai * ratio) / den;
		c->dimag = (ai - ar * ratio) / den;
	}

}

_Fz_mult(dc, a, b)
dcomplex *a, *b, *dc;
{
  	dc->dreal = (a->dreal *  b->dreal) - (a->dimag *  b->dimag);
  	dc->dimag = (a->dreal *  b->dimag) + (a->dimag *  b->dreal);
}
 

 
_Fz_minus(dc, a, b)
dcomplex *a, *b, *dc;
{
 	dc->dreal = a->dreal - b->dreal;
  	dc->dimag = a->dimag - b->dimag;
}
 

 
_Fz_add(dc, a, b)
dcomplex *a, *b, *dc;
{
 	dc->dreal = a->dreal + b->dreal;
 	dc->dimag = a->dimag + b->dimag;
}
 

 
_Fz_neg(dc, a)
dcomplex *dc, *a;
{
  	dc->dreal = - a->dreal;
  	dc->dimag = - a->dimag;
}
 

/* convert float to double complex */
 
_Ff_conv_z(dc,f)	
dcomplex *dc;
FLOATPARAMETER f;
{
 	dc->dreal = FLOATPARAMETERVALUE(f);
 	dc->dimag = 0.0;
}
 

/* convert double complex to float */

FLOATFUNCTIONTYPE
_Fz_conv_f(dc)
dcomplex *dc;
{
float f ;

	f = dc->dreal ;
 	RETURNFLOAT(f);
}
 

/* convert double complex to int */
 
int
_Fz_conv_i(dc)
dcomplex *dc;
{
	return (int)dc->dreal;
}
 

/* convert int to double complex */
 
_Fi_conv_z(dc,i)	
dcomplex *dc;
int i;
{
 	dc->dreal = (double)i;
 	dc->dimag = 0.0;
}
 

/* convert double complex to double */
 
double
_Fz_conv_d(dc)
dcomplex *dc;
{
 	return dc->dreal;
}
 

/* convert double to double complex */
 
_Fd_conv_z(dc,d)	
dcomplex *dc;
double d;
{
	dc->dreal = d;
 	dc->dimag = 0.0;
}
 

/* convert double complex to complex  */
 
void
_Fz_conv_c(c,dc)		
complex *c;
dcomplex *dc;
{
	c->real = (float)dc->dreal;
	c->imag = (float)dc->dimag;
}
