# Complex Numbers in C

Could someone give me sone help on working out complex root using C?

Here is my code so far:
#include <stdio.h>
#include <math.h>

double t1=0,t2=0,t3=0;
double quad1(double t1,double t2, double t3);
double quad2(double t1,double t2, double t3);

main()
{
printf("Enter the X square coeff: ");
scanf("%lf",&t1);
printf("Enter the X coeff: ");
scanf("%lf",&t2);
printf("Enter the last term: ");
scanf("%lf",&t3);

}

double quad1(double t1,double t2, double t3)
{
double ans1=0,det1=0;

det1= pow(t2,2) - (4*t1*t3); // b^2 - 4ac
ans1= (((-1)*t2) + pow(det1,0.5))/(2*t1);
return(ans1);
}

double quad2(double t1,double t2, double t3)
{
double ans2=0,det2=0;

det2= pow(t2,2) - (4*t1*t3); // b^2 - 4ac
ans2= (((-1)*t2) - pow(det2,0.5))/(2*t1);
return(ans2);
}

As you can see, it only works out real roots

Cheers
###### Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x

Data Warehouse Architect / DBACommented:
Hi jonnytabpni,

The C math routines that you're using (pow) doesn't deal with imaginary numbers.  To get the results you seek, you'll need to determine if the result will be real or imaginary, set a flag accordingly, and if imaginary, pass the absolute value of the data item.

The result is that the function will always return the root value, and you'll indicate in a separate field whether the result is real or imaginary.

Good Luck,
Kent
0

Author Commented:
ok fair enough but im confused how to actually work out the complex roots once iv passed the data onto a seperate function.

cheers
0

Data Warehouse Architect / DBACommented:
Hi jonnytabpni,

There are several ways to do this, though they all require a bit of effort.

C functions return one value.  Period.  So you can't get the function to return the real root and a real/imaginary flag.  The two most common ways around this are to return one or both values via function parameters, or to build a 'complex' structure that contains a the two critical components and pass it to the function.

typedef struct
{
int    Imaginary;
rel   Value;
) compex_t;

Good Luck,
Kent
0

Author Commented:
ok i've got it:

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

double a,b,c;
int find_roots(double,double,double,double*,double*);

main()

{
double x1,x2;
int type;

printf("Enter the 3 quadratic coeffs: ");
scanf("%lf %lf %lf",&a,&b,&c);

type = find_roots(a,b,c, &x1,&x2);

if(type==0)
{
printf("The 2 solutions of your equation are: %lf and %lf",x1,x2);
if((((-1)*b)/a) == (x1+x2)) printf("\nCheck Confirmed!"); //Check to see if real roots are correct
}
else
{
printf("The 2 complex roots of your equations are %lf + j%lf and %lf - j%lf",x1,fabs(x2),x1,fabs(x2));
}

}

int find_roots(double a,double b, double c,double *x1,double *x2)

{

double ans1=0,det=0;

det= pow(b,2) - (4*a*c); // b^2 - 4ac

if(det>0)
{
det = sqrt(det);

*x1 = ((-1)*(b))/(2*a) + (det/(2*a));
*x2 = ((-1)*(b))/(2*a) - (det/(2*a));
return(0);
}
else
{
*x1 = ((-1)*(b))/(2*a);
*x2 = det/(2*a);
return(1);
}
}

the only thing i need now is a way to check to see if the comple roots are correct
0

Data Warehouse Architect / DBACommented:
Hi jonnytabpni,

That should be pretty easy to do.  Build several test cases of known values.

4  ^  2
9  ^  2

4  ^  1/2
9  ^  1/2

If the values are correct (and they should be) rerun the test with negative coefficients.

Then, just to make sure:

27 ^ 1/3
-27 ^ 1/3

Good Luck,
Kent
0

Commented:
Have you Looked into Complex.h.
0