复杂事业部

Complex Division

我的部门输出有问题。当我同时输入 5 和 3 的实部以及 4 和 2 的虚部时,我得到 2.000000 + -2.000000i 而不是 1.769231 + 0.153846i.

在主程序中划分的情况如下:

case 4:
     num1=Read_Complex();
     num2=Read_Complex();
     if ((num2.real=0)&&(num2.img=0));
     printf("Error. Cannot divide by 0.\n");
     }
     else{
        ans=Divide_Complex(num1,num2);
     }

这里是调用 Read_Complex 的地方:

complex Read_Complex(void)
{
complex num;

printf("Enter real part:");
scanf("%d", &num.real);
printf("Enter img part:");
scanf("%d", &num.img);

return num;
}

这是除法:

complex numer, denom;
float ans_real ans_img;

complex Divide_Complex(complex num1, complex num2)
{
   numer=Multiply_Complex(num1, Conjugate_Complex(num2));
   denom=Multiply_Complex(num2, Conjugate_Complex(num2));

   ans_real=numer.real/denom.real;
   ans_img=numer.img/denom.img;

   printf("%f + %fi\n", ans_real, ans_img);
}

任何帮助都会很棒。

Complex.h:

#ifndef COMPLEX_H_
#define COMPLEX_H_

typedef struct {
    int real;
    int img;
} complex;

#endif

你有几个问题,其中很多都在你的问题的评论中提到了,但至少有一个重要的问题没有。您似乎已经认识到检查被零除的问题。除此之外,

首先,您的函数 Divide_complex() 被声明为 return 一个值,但是控制到达函数的末尾而没有执行 return 语句。如果调用者尝试使用 return 值,则会导致未定义的行为;您的编译器应该对此发出警告。

其次,您的 complex 数据类型完全不适合表示复数,因为它只为实部和虚部提供整数值。特别是,它不能代表任何接近您特别询问的商数。

第三,Divide_Complex() 在除复数的分量时执行 整数 除法,必然提供整数结果。从某种意义上说,您的 complex 数据类型无论如何只能包含整数部分,但它无法产生接近您期望的结果。

但是第四,你把数学编码错了。您将修改后的分母计算为原始分母与其共轭的乘积,这很好,但结果是一个 实数 数字,没有虚部。这就是重点——它将复数/复数商变成复数/实数商。您应该将商的虚部计算为 ans_img = (float) numer.img / denom.real(除以 denom.real,而不是 denom.img)。你现在这样做的方式应该导致整数除以零,因为如果其他一切正常,denom.img 将为零。