以极坐标形式表示的复数之和
Sum of complex numbers expressed in polar form
我需要对两个复数 (c1,c2) 求和,然后用极坐标形式表示结果。
我真的不知道如何访问 c1+c2 的结果,我的意思是我将它们存储在变量“result”中,但是当我尝试访问它们时,我发现自己在 ComplexPolar 结构中,所以我可以't 访问 result.real 和 result.img 来计算大小和角度:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct ComplexCartesian
{
float real;
float img;
};
struct ComplexPolar
{
float magnitude;
float angle;
};
struct ComplexPolar add_two_complex(struct ComplexCartesian c1, struct ComplexCartesian c2, struct ComplexPolar result)
{
result.real= c1.real+c2.real;
result.img=c1.img+c2.img;
result.magnitude= sqrt((result.real)^2 + (result.img)^2);
result.angle= atan2(result.img, result.real);
}
^2
不是您在 C 中平方的方式,您必须将数字乘以自身或使用 libc pow
函数。
^2
是一个 XOR 操作,您的目标是切换第二位,但在您的情况下,您在浮点数上使用它,这违反了严格的别名规则并导致 undefined behavior (在顶部不是你想要的)。
查看下面的代码并附上一些注释:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct ComplexCartesian
{
float real;
float img;
};
struct ComplexPolar
{
float magnitude;
float angle;
};
struct ComplexPolar polar_from_cartesian_sum(struct ComplexCartesian c1, struct ComplexCartesian c2)
{
struct ComplexPolar complexPolar; // here you declare the variable of your ComplexPolar struct
c1.real += c2.real; // you don't need to have a result var, you can just reuse c1.
c1.img += c2.img;
complexPolar.magnitude = sqrt(c1.real * c1.real + c1.img * c1.img);
complexPolar.angle = atan2(c1.img, c1.real);
return complexPolar; // you return the value;
}
int main(void) {
struct ComplexCartesian c1 = {0.12f, 0.15f};
struct ComplexCartesian c2 = {0.42f, 1.15f};
struct ComplexPolar complexPolar = polar_from_cartesian_sum(c1, c2);
printf("%f %f\n", complexPolar.magnitude, complexPolar.angle);
return 0;
}
用gcc complex.c -lm && ./a.out
编译
输出:
1.407693 1.177098
注意:也许您应该明确说明您的角度以弧度表示,并将您的函数重命名为 polar_from_cartesian_sum
Radius = 1.41
θ = 67.44o = 1.18 radians
我需要对两个复数 (c1,c2) 求和,然后用极坐标形式表示结果。
我真的不知道如何访问 c1+c2 的结果,我的意思是我将它们存储在变量“result”中,但是当我尝试访问它们时,我发现自己在 ComplexPolar 结构中,所以我可以't 访问 result.real 和 result.img 来计算大小和角度:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct ComplexCartesian
{
float real;
float img;
};
struct ComplexPolar
{
float magnitude;
float angle;
};
struct ComplexPolar add_two_complex(struct ComplexCartesian c1, struct ComplexCartesian c2, struct ComplexPolar result)
{
result.real= c1.real+c2.real;
result.img=c1.img+c2.img;
result.magnitude= sqrt((result.real)^2 + (result.img)^2);
result.angle= atan2(result.img, result.real);
}
^2
不是您在 C 中平方的方式,您必须将数字乘以自身或使用 libc pow
函数。
^2
是一个 XOR 操作,您的目标是切换第二位,但在您的情况下,您在浮点数上使用它,这违反了严格的别名规则并导致 undefined behavior (在顶部不是你想要的)。
查看下面的代码并附上一些注释:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct ComplexCartesian
{
float real;
float img;
};
struct ComplexPolar
{
float magnitude;
float angle;
};
struct ComplexPolar polar_from_cartesian_sum(struct ComplexCartesian c1, struct ComplexCartesian c2)
{
struct ComplexPolar complexPolar; // here you declare the variable of your ComplexPolar struct
c1.real += c2.real; // you don't need to have a result var, you can just reuse c1.
c1.img += c2.img;
complexPolar.magnitude = sqrt(c1.real * c1.real + c1.img * c1.img);
complexPolar.angle = atan2(c1.img, c1.real);
return complexPolar; // you return the value;
}
int main(void) {
struct ComplexCartesian c1 = {0.12f, 0.15f};
struct ComplexCartesian c2 = {0.42f, 1.15f};
struct ComplexPolar complexPolar = polar_from_cartesian_sum(c1, c2);
printf("%f %f\n", complexPolar.magnitude, complexPolar.angle);
return 0;
}
用gcc complex.c -lm && ./a.out
输出:
1.407693 1.177098
注意:也许您应该明确说明您的角度以弧度表示,并将您的函数重命名为 polar_from_cartesian_sum
Radius = 1.41
θ = 67.44o = 1.18 radians