-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomplexNumbers.cpp
123 lines (106 loc) · 1.97 KB
/
complexNumbers.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* @file complexNumbers.cpp
* @author Melih Altun @2015-2017
**/
#include "complexNumbers.h"
// z = z1 + z2
complex complexAddition(complex z1, complex z2)
{
complex z;
z.real = z1.real + z2.real;
z.imag = z1.imag + z2.imag;
return z;
}
// z = z1 - z2
complex complexSubtraction(complex z1, complex z2)
{
complex z;
z.real = z1.real - z2.real;
z.imag = z1.imag - z2.imag;
return z;
}
// z = z1 x z2
complex complexMultiplication(complex z1, complex z2)
{
complex z;
z.real = (z1.real * z2.real) - (z1.imag * z2.imag);
z.imag = (z1.real * z2.imag) + (z1.imag * z2.real);
return z;
}
// z = z1 / z2
complex complexDivision(complex z1, complex z2)
{
complex z, conj_z2, z2_conj_z2;
conj_z2 = complexConjugate(z2);
z2_conj_z2 = complexMultiplication(z2, conj_z2);
z = complexMultiplication(z1, conj_z2);
z.real /= z2_conj_z2.real;
z.imag /= z2_conj_z2.real;
return z;
}
// z = z1*
complex complexConjugate(complex z1)
{
complex z;
z.real = z1.real;
z.imag = -z1.imag;
return z;
}
// z = -z1
complex negate(complex z1)
{
complex z;
z.real = -z1.real;
z.imag = -z1.imag;
return z;
}
// z = z1
complex equals(complex z1)
{
complex z;
z.real = z1.real;
z.imag = z1.imag;
return z;
}
// m = |z|
double magnitude(complex z1)
{
return sqrt(z1.real*z1.real + z1.imag*z1.imag);
}
// theta = <z
double angle(complex z1)
{
return atan2(z1.imag, z1.real);
}
// z = exp(j alpha);
complex complexExp(double alpha)
{
complex z;
z.real = cos(alpha);
z.imag = sin(alpha);
return z;
}
// r = |m|, theta = <z
void z2polar(complex z, double *r, double *theta)
{
*r = magnitude(z);
*theta = angle(z);
}
// z = r exp(j theta)
complex polar2z(double r, double theta)
{
complex z;
z.real = r*cos(theta);
z.imag = r*sin(theta);
return z;
}
// z2 = sqrt(z1)
complex complexSqrt(complex z1) {
double r, theta;
complex z2;
r = sqrt(z1.real * z1.real + z1.imag * z1.imag);
theta = angle(z1);
z2.real = sqrt(r) * cos(theta / 2);
z2.imag = sqrt(r) * sin(theta / 2);
return z2;
}