2013-12-09 25 views
0

我刚刚开始C编程(而不是C++),我必须转换二次公式来解决复杂的根,并打印这些。正常二次方程(用于判别> 0),如下所示:如何创建现有函数的复杂类型?

else { 
     /* */ 
     x1 = ((-b) + sqrt(discr))/(2 * a); 
     x2 = ((-b) - sqrt(discr))/(2 * a); 
     printf("%s%.4lf%s%.4lf\n\n", "x1: ", x1, "\tx2: ", x2); 
    } 

当我尝试将其转换成其复杂的价值观我已经使用了以下策略:

  • 创建的新版本的SQRT(DISCR),公式中的复杂的部分,结果通过创建一个可变_Complex双discr_complex = DISCR * I. - > OR discr_complex = DISCR + DISCR * I.

  • 制作x1和x2复杂由'complex x1'o r'_Complex c1'或'complex x1 = ..formula .. * I'或'_Complex x1 = ... formula * I'。

  • 使用关键字complex使每个部分变得复杂。

对于所有这些版本,它不打印正确的复杂输出(#+#i)。我尝试打印正常值,这是正常的,但不适用于复杂的部分。我尝试使用方法creal(x1)和cimag(x1),它们不起作用(未声明的引用creal/cimag),或者x1.real()/ x1.imag(),这也不起作用('imag'在某种不是结构或联盟的情况下)。

有人可能知道如何将我的x1和x2值转换为复数,也许有一个清晰的解释如何返回复杂方程(真实/虚构)的每个分离部分以及如何转换发生我的'正常'公式?

回答

0

的原因,调用creal不工作是,要么您还没有正确的头文件complex.h或者您正在使用的说法x1这是正确的类型double complex不调用它。第二个错误,当您拨打x1.real()时,是因为.表示法尝试访问struct的成员,但x1是双精度。

我建议使用complex.h,它能够处理复数并定义一个处理复数的新abc公式。还要注意,对于复杂类型的变量,不能使用“常规”数学函数,如sqrt,但需要使用complex.h类似函数。 csqrt()

#include <complex.h> 

int main(void) 
{ 
    double complex z = 1.0 + 0.5 * I; 

    printf("The real part of z = %f\n", creal(z)); 
    printf("The iamginary part of z = %f\n", cimag(z)); 

    return 0; 
} 

编辑:

完全重新定义你的功能,尝试这样的事情:

void complex_abc() { 

    double complex a = 1; 
    double complex b = 2; 
    double complex c = 3; 
    double complex x1; 
    double complex x2; 
    double complex d; 

    d = b*b - 4 * a * c; 
    x1 = (-b + csqrt(d))/2*a; 
    x2 = (-b - csqrt(d))/2*a; 

    printf("x1 = %f + i %f\n", creal(x1), cimag(x1)); 
    printf("x2 = %f + i %f\n", creal(x2), cimag(x2)); 

    return; 
} 

而作为正确地指出@Lutzl在评论中,你需要数学库的链接标志-lm在编译期间

+0

OK会试试,谢谢!附:我已经添加了complex.h,应该提到! csqrt是。 – user2892481

+0

现在它给'未定义的引用csqrt'! – user2892481

+0

尝试此操作:else if(discr <0) { double complex x3,x4; double complex discr_complex = discr * I; double complex sqrt_complex = csqrt(discr_complex); printf(“%f”,sqrt_complex); – user2892481