我刚刚开始 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/