我刚刚开始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值转换成复数,可能会清楚地解释如何返回复杂方程的每个单独部分(实/虚)以及如何进行这种转换取我的'正常'式?
答案 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
链接