Tech or Treat! Write an article about your scariest tech disaster to win gadgets!Learn more

x
?
Solved

Complex Numbers in C

Posted on 2007-11-26
6
Medium Priority
?
370 Views
Last Modified: 2010-04-15
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
0
Comment
Question by:jonnytabpni
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 46

Accepted Solution

by:
Kent Olsen earned 2000 total points
ID: 20349823
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 Comment

by:jonnytabpni
ID: 20349946
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
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 20349993
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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:jonnytabpni
ID: 20350368
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
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 20350641
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
 
LVL 5

Expert Comment

by:mandelia
ID: 20356731
Have you Looked into Complex.h.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
How to Win a Jar of Candy Corn: A Scientific Approach! I love mathematics. If you love mathematics also, you may enjoy this tip on how to use math to win your own jar of candy corn and to impress your friends. As I said, I love math, but I gu…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.

647 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question