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

标签 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(discr)(方程中的复数部分)结果的新版本。 -> 或 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'在某种不是结构或 union 的东西中)。

是否有人知道如何将我的 x1 和 x2 值转换为复数,也许可以清楚地解释如何返回复数方程的每个单独部分(实数/虚数)以及如何在我的“正常”情况下进行这种转换公式?

最佳答案

调用creal不起作用的原因是您没有包含正确的 header complex.h或者您使用参数x1调用它 不是正确的双复数类型。当您调用 x1.real() 时,第二个错误是因为 . 表示法尝试访问 struct 的成员,但 x1 是一个 double 。

我建议使用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 链接

关于c - 如何创建现有函数的复杂类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20480350/

相关文章:

scala - 不明白 scalaz 内函数

c++ - 水粒子模型

c - C 编程中的链表插入和排序

javascript - 如何组合单选和输入框中的值并在单击按钮时打开 url?

有人可以澄清这段代码吗?

scala - 隐式转换不起作用

scala - 关于隐式的奇怪错误消息

c - 在没有 <string.h> 的情况下将一个字符串设置为等于另一个字符串

c - 通过 TCP 发送和接收结构体

java - 用最少的计算量寻找素数的算法