复杂事业部
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
将为零。
我的部门输出有问题。当我同时输入 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
将为零。