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
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
}
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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
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
ASKER
ok i've got it:
#include <stdio.h>
#include <math.h>
double a,b,c;
int find_roots(double,double,d ouble,doub le*,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
#include <stdio.h>
#include <math.h>
double a,b,c;
int find_roots(double,double,d
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(
}
}
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
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.
ASKER
cheers