如何创建现有函数的复杂类型?

时间:2013-12-09 20:42:15

标签: c function implicit-conversion complex-numbers

我刚刚开始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);
    }

当我尝试将其转换为复杂值时,我使用了以下策略:

  • 通过创建变量_Complex double discr_complex = discr * I,创建sqrt(discrimin)结果的新版本,即等式中的复杂部分。 - > OR discr_complex = discrimination + discrimination * I。

  • 使x1和x2复杂化为'complex x1'或'_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值转换成复数,可能会清楚地解释如何返回复杂方程的每个单独部分(实/虚)以及如何进行这种转换取我的'正常'式?

1 个答案:

答案 0 :(得分: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链接