-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathComplex.cc
127 lines (110 loc) · 2.44 KB
/
Complex.cc
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
124
125
126
127
//
// ECE3090 Program 3 - Complex Number Class implementation
// YOUR NAME HERE
// PLATFORM (Windows or Linux)
//
#include <iostream>
#include <string>
#include <math.h>
#include "Complex.h"
using namespace std;
// Constructors
Complex::Complex()
: real(0), imag(0), NaN(false)
{
}
Complex::Complex(bool n)
: real(0), imag(0), NaN(n)
{
}
Complex::Complex(double r)
: real(r), imag(0), NaN(false)
{
}
Complex::Complex(double r, double i)
: real(r), imag(i), NaN(false)
{
}
// Operators
Complex Complex::operator+(const Complex& b) const
{
if (NaN || b.NaN) return Complex(true); // Not a number
return Complex(real + b.real, imag + b.imag);
}
Complex Complex::operator-(const Complex& b) const
{
if (NaN || b.NaN) return Complex(true); // Not a number
return Complex(real - b.real, imag - b.imag);
}
Complex Complex::operator*(const Complex& b) const
{
if (NaN || b.NaN) return Complex(true); // NaN
return Complex(real*b.real - imag*b.imag,
real*b.imag + imag*b.real);
}
Complex Complex::operator/(const Complex& b) const
{
if (NaN || b.NaN) return Complex(true); // NaN
Complex tmp = (*this) * b.Conj();
Complex magSquared = b.Mag() * b.Mag();
if (magSquared.Mag().real == 0.0)
{
return Complex(true); // Nan
}
return Complex(tmp.real/magSquared.real, tmp.imag/magSquared.real);
}
// Member functions
Complex Complex::Mag() const
{
if (NaN) return Complex(true); // Not a number
return Complex(sqrt(real*real + imag*imag));
}
Complex Complex::Angle() const
{
if (NaN) return Complex(true); // Not a number
if (Mag().real == 0) return Complex(true);
return Complex(atan2(imag, real) * 360 / (2 * M_PI));
}
Complex Complex::Conj() const
{ // Return to complex conjugate
if (NaN) return Complex(true); // Not a number
return Complex(real, -imag);
}
void Complex::Print() const
{
if (NaN)
{
cout << "NaN";
}
else
{
if (imag == 0)
{ // just real part with no parens
cout << real;
}
else
{
cout << '(' << real << "," << imag << ')';
}
}
}
// Global function to output a Complex value
std::ostream& operator << (std::ostream &os, const Complex& c)
{
if (c.NaN)
{
os << "NaN";
}
else
{
if (c.imag == 0)
{ // just real part with no parens
os << c.real;
}
else
{
os << '(' << c.real << "," << c.imag << ')';
}
}
return os;
}