Link to home
Start Free TrialLog in
Avatar of jonnytabpni
jonnytabpni

asked on

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);

      printf("The 2 solutions of your equation are: %lf and %lf",quad1(t1,t2,t3),quad2(t1,t2,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
ASKER CERTIFIED SOLUTION
Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of jonnytabpni
jonnytabpni

ASKER

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

cheers
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
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
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
Have you Looked into Complex.h.