【问题标题】:How to create a complex type of a existing function?如何创建现有函数的复杂类型?
【发布时间】:2013-12-27 03:16:33
【问题描述】:

我刚刚开始 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(discr) 结果的新版本。 -> OR discr_complex = discr + discr * I.

  • 通过 'complex x1' 或 '_Complex c1' 或 'complex x1 = ..formula.. * I' 或 '_Complex x1 = ...formula * I' 使 x1 和 x2 成为复数。

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

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

是否有人可能知道如何将我的 x1 和 x2 值转换为复数,并可能清楚地解释如何返回复杂方程的每个单独部分(实数/虚数)以及这种转换是如何发生的公式?

【问题讨论】:

    标签: c function implicit-conversion complex-numbers


    【解决方案1】:

    调用creal 不起作用的原因是您没有包含正确的标题complex.h,或者您使用不正确类型double complex 的参数x1 调用它。第二个错误,当您调用 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 在 cmets 中正确指出的那样,您需要在编译期间将数学库与标志 -lm 链接

    【讨论】:

    • 好的,试试,谢谢!附言我添加了complex.h,应该提到! csqrt 是。
    • 现在它给出了“未定义的 csqrt 引用”!
    • 试试这个:else if (discr
    • 换一种说法:这个公式的实部和虚部是什么?我应该如何重新输入我的公式以获得复杂性?
    • 仍然收到 csqrt undefined reference 错误。你知道这是什么意思或我应该调整什么吗?我有#include .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多