Dependencies:   DMSupport DMemWin

Committer:
destinyXfate
Date:
Thu Jun 02 05:04:57 2016 +0000
Revision:
0:08606a13a816
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
destinyXfate 0:08606a13a816 1 #ifndef _COMPLEX_H_
destinyXfate 0:08606a13a816 2 #define _COMPLEX_H_
destinyXfate 0:08606a13a816 3
destinyXfate 0:08606a13a816 4 #include "mbed.h"
destinyXfate 0:08606a13a816 5
destinyXfate 0:08606a13a816 6 class complex
destinyXfate 0:08606a13a816 7 {
destinyXfate 0:08606a13a816 8 protected:
destinyXfate 0:08606a13a816 9 // Internal presentation - real and imaginary parts
destinyXfate 0:08606a13a816 10 double m_re;
destinyXfate 0:08606a13a816 11 double m_im;
destinyXfate 0:08606a13a816 12
destinyXfate 0:08606a13a816 13 public:
destinyXfate 0:08606a13a816 14 // Imaginary unity
destinyXfate 0:08606a13a816 15 static const complex i;
destinyXfate 0:08606a13a816 16 static const complex j;
destinyXfate 0:08606a13a816 17
destinyXfate 0:08606a13a816 18 // Constructors
destinyXfate 0:08606a13a816 19 complex(): m_re(0.), m_im(0.) {}
destinyXfate 0:08606a13a816 20 complex(double re, double im): m_re(re), m_im(im) {}
destinyXfate 0:08606a13a816 21 complex(double val): m_re(val), m_im(0.) {}
destinyXfate 0:08606a13a816 22
destinyXfate 0:08606a13a816 23 // Assignment
destinyXfate 0:08606a13a816 24 complex& operator= (const double val)
destinyXfate 0:08606a13a816 25 {
destinyXfate 0:08606a13a816 26 m_re = val;
destinyXfate 0:08606a13a816 27 m_im = 0.;
destinyXfate 0:08606a13a816 28 return *this;
destinyXfate 0:08606a13a816 29 }
destinyXfate 0:08606a13a816 30
destinyXfate 0:08606a13a816 31 // Basic operations - taking parts
destinyXfate 0:08606a13a816 32 double re() const { return m_re; }
destinyXfate 0:08606a13a816 33 double im() const { return m_im; }
destinyXfate 0:08606a13a816 34
destinyXfate 0:08606a13a816 35 // Conjugate number
destinyXfate 0:08606a13a816 36 complex conjugate() const
destinyXfate 0:08606a13a816 37 {
destinyXfate 0:08606a13a816 38 return complex(m_re, -m_im);
destinyXfate 0:08606a13a816 39 }
destinyXfate 0:08606a13a816 40
destinyXfate 0:08606a13a816 41 // Norm
destinyXfate 0:08606a13a816 42 double norm() const
destinyXfate 0:08606a13a816 43 {
destinyXfate 0:08606a13a816 44 return m_re * m_re + m_im * m_im;
destinyXfate 0:08606a13a816 45 }
destinyXfate 0:08606a13a816 46
destinyXfate 0:08606a13a816 47 // Arithmetic operations
destinyXfate 0:08606a13a816 48 complex operator+ (const complex& other) const
destinyXfate 0:08606a13a816 49 {
destinyXfate 0:08606a13a816 50 return complex(m_re + other.m_re, m_im + other.m_im);
destinyXfate 0:08606a13a816 51 }
destinyXfate 0:08606a13a816 52
destinyXfate 0:08606a13a816 53 complex operator- (const complex& other) const
destinyXfate 0:08606a13a816 54 {
destinyXfate 0:08606a13a816 55 return complex(m_re - other.m_re, m_im - other.m_im);
destinyXfate 0:08606a13a816 56 }
destinyXfate 0:08606a13a816 57
destinyXfate 0:08606a13a816 58 complex operator* (const complex& other) const
destinyXfate 0:08606a13a816 59 {
destinyXfate 0:08606a13a816 60 return complex(m_re * other.m_re - m_im * other.m_im,
destinyXfate 0:08606a13a816 61 m_re * other.m_im + m_im * other.m_re);
destinyXfate 0:08606a13a816 62 }
destinyXfate 0:08606a13a816 63
destinyXfate 0:08606a13a816 64 complex operator/ (const complex& other) const
destinyXfate 0:08606a13a816 65 {
destinyXfate 0:08606a13a816 66 const double denominator = other.m_re * other.m_re + other.m_im * other.m_im;
destinyXfate 0:08606a13a816 67 return complex((m_re * other.m_re + m_im * other.m_im) / denominator,
destinyXfate 0:08606a13a816 68 (m_im * other.m_re - m_re * other.m_im) / denominator);
destinyXfate 0:08606a13a816 69 }
destinyXfate 0:08606a13a816 70
destinyXfate 0:08606a13a816 71 complex& operator+= (const complex& other)
destinyXfate 0:08606a13a816 72 {
destinyXfate 0:08606a13a816 73 m_re += other.m_re;
destinyXfate 0:08606a13a816 74 m_im += other.m_im;
destinyXfate 0:08606a13a816 75 return *this;
destinyXfate 0:08606a13a816 76 }
destinyXfate 0:08606a13a816 77
destinyXfate 0:08606a13a816 78 complex& operator-= (const complex& other)
destinyXfate 0:08606a13a816 79 {
destinyXfate 0:08606a13a816 80 m_re -= other.m_re;
destinyXfate 0:08606a13a816 81 m_im -= other.m_im;
destinyXfate 0:08606a13a816 82 return *this;
destinyXfate 0:08606a13a816 83 }
destinyXfate 0:08606a13a816 84
destinyXfate 0:08606a13a816 85 complex& operator*= (const complex& other)
destinyXfate 0:08606a13a816 86 {
destinyXfate 0:08606a13a816 87 const double temp = m_re;
destinyXfate 0:08606a13a816 88 m_re = m_re * other.m_re - m_im * other.m_im;
destinyXfate 0:08606a13a816 89 m_im = m_im * other.m_re + temp * other.m_im;
destinyXfate 0:08606a13a816 90 return *this;
destinyXfate 0:08606a13a816 91 }
destinyXfate 0:08606a13a816 92
destinyXfate 0:08606a13a816 93 complex& operator/= (const complex& other)
destinyXfate 0:08606a13a816 94 {
destinyXfate 0:08606a13a816 95 const double denominator = other.m_re * other.m_re + other.m_im * other.m_im;
destinyXfate 0:08606a13a816 96 const double temp = m_re;
destinyXfate 0:08606a13a816 97 m_re = (m_re * other.m_re + m_im * other.m_im) / denominator;
destinyXfate 0:08606a13a816 98 m_im = (m_im * other.m_re - temp * other.m_im) / denominator;
destinyXfate 0:08606a13a816 99 return *this;
destinyXfate 0:08606a13a816 100 }
destinyXfate 0:08606a13a816 101
destinyXfate 0:08606a13a816 102 complex& operator++ ()
destinyXfate 0:08606a13a816 103 {
destinyXfate 0:08606a13a816 104 ++m_re;
destinyXfate 0:08606a13a816 105 return *this;
destinyXfate 0:08606a13a816 106 }
destinyXfate 0:08606a13a816 107
destinyXfate 0:08606a13a816 108 complex operator++ (int)
destinyXfate 0:08606a13a816 109 {
destinyXfate 0:08606a13a816 110 complex temp(*this);
destinyXfate 0:08606a13a816 111 ++m_re;
destinyXfate 0:08606a13a816 112 return temp;
destinyXfate 0:08606a13a816 113 }
destinyXfate 0:08606a13a816 114
destinyXfate 0:08606a13a816 115 complex& operator-- ()
destinyXfate 0:08606a13a816 116 {
destinyXfate 0:08606a13a816 117 --m_re;
destinyXfate 0:08606a13a816 118 return *this;
destinyXfate 0:08606a13a816 119 }
destinyXfate 0:08606a13a816 120
destinyXfate 0:08606a13a816 121 complex operator-- (int)
destinyXfate 0:08606a13a816 122 {
destinyXfate 0:08606a13a816 123 complex temp(*this);
destinyXfate 0:08606a13a816 124 --m_re;
destinyXfate 0:08606a13a816 125 return temp;
destinyXfate 0:08606a13a816 126 }
destinyXfate 0:08606a13a816 127
destinyXfate 0:08606a13a816 128 complex operator+ (const double val) const
destinyXfate 0:08606a13a816 129 {
destinyXfate 0:08606a13a816 130 return complex(m_re + val, m_im);
destinyXfate 0:08606a13a816 131 }
destinyXfate 0:08606a13a816 132
destinyXfate 0:08606a13a816 133 complex operator- (const double val) const
destinyXfate 0:08606a13a816 134 {
destinyXfate 0:08606a13a816 135 return complex(m_re - val, m_im);
destinyXfate 0:08606a13a816 136 }
destinyXfate 0:08606a13a816 137
destinyXfate 0:08606a13a816 138 complex operator* (const double val) const
destinyXfate 0:08606a13a816 139 {
destinyXfate 0:08606a13a816 140 return complex(m_re * val, m_im * val);
destinyXfate 0:08606a13a816 141 }
destinyXfate 0:08606a13a816 142
destinyXfate 0:08606a13a816 143 complex operator/ (const double val) const
destinyXfate 0:08606a13a816 144 {
destinyXfate 0:08606a13a816 145 return complex(m_re / val, m_im / val);
destinyXfate 0:08606a13a816 146 }
destinyXfate 0:08606a13a816 147
destinyXfate 0:08606a13a816 148 complex& operator+= (const double val)
destinyXfate 0:08606a13a816 149 {
destinyXfate 0:08606a13a816 150 m_re += val;
destinyXfate 0:08606a13a816 151 return *this;
destinyXfate 0:08606a13a816 152 }
destinyXfate 0:08606a13a816 153
destinyXfate 0:08606a13a816 154 complex& operator-= (const double val)
destinyXfate 0:08606a13a816 155 {
destinyXfate 0:08606a13a816 156 m_re -= val;
destinyXfate 0:08606a13a816 157 return *this;
destinyXfate 0:08606a13a816 158 }
destinyXfate 0:08606a13a816 159
destinyXfate 0:08606a13a816 160 complex& operator*= (const double val)
destinyXfate 0:08606a13a816 161 {
destinyXfate 0:08606a13a816 162 m_re *= val;
destinyXfate 0:08606a13a816 163 m_im *= val;
destinyXfate 0:08606a13a816 164 return *this;
destinyXfate 0:08606a13a816 165 }
destinyXfate 0:08606a13a816 166
destinyXfate 0:08606a13a816 167 complex& operator/= (const double val)
destinyXfate 0:08606a13a816 168 {
destinyXfate 0:08606a13a816 169 m_re /= val;
destinyXfate 0:08606a13a816 170 m_im /= val;
destinyXfate 0:08606a13a816 171 return *this;
destinyXfate 0:08606a13a816 172 }
destinyXfate 0:08606a13a816 173
destinyXfate 0:08606a13a816 174 friend complex operator+ (const double left, const complex& right)
destinyXfate 0:08606a13a816 175 {
destinyXfate 0:08606a13a816 176 return complex(left + right.m_re, right.m_im);
destinyXfate 0:08606a13a816 177 }
destinyXfate 0:08606a13a816 178
destinyXfate 0:08606a13a816 179 friend complex operator- (const double left, const complex& right)
destinyXfate 0:08606a13a816 180 {
destinyXfate 0:08606a13a816 181 return complex(left - right.m_re, -right.m_im);
destinyXfate 0:08606a13a816 182 }
destinyXfate 0:08606a13a816 183
destinyXfate 0:08606a13a816 184 friend complex operator* (const double left, const complex& right)
destinyXfate 0:08606a13a816 185 {
destinyXfate 0:08606a13a816 186 return complex(left * right.m_re, left * right.m_im);
destinyXfate 0:08606a13a816 187 }
destinyXfate 0:08606a13a816 188
destinyXfate 0:08606a13a816 189 friend complex operator/ (const double left, const complex& right)
destinyXfate 0:08606a13a816 190 {
destinyXfate 0:08606a13a816 191 const double denominator = right.m_re * right.m_re + right.m_im * right.m_im;
destinyXfate 0:08606a13a816 192 return complex(left * right.m_re / denominator,
destinyXfate 0:08606a13a816 193 -left * right.m_im / denominator);
destinyXfate 0:08606a13a816 194 }
destinyXfate 0:08606a13a816 195
destinyXfate 0:08606a13a816 196 // Boolean operators
destinyXfate 0:08606a13a816 197 bool operator== (const complex &other) const
destinyXfate 0:08606a13a816 198 {
destinyXfate 0:08606a13a816 199 return m_re == other.m_re && m_im == other.m_im;
destinyXfate 0:08606a13a816 200 }
destinyXfate 0:08606a13a816 201
destinyXfate 0:08606a13a816 202 bool operator!= (const complex &other) const
destinyXfate 0:08606a13a816 203 {
destinyXfate 0:08606a13a816 204 return m_re != other.m_re || m_im != other.m_im;
destinyXfate 0:08606a13a816 205 }
destinyXfate 0:08606a13a816 206
destinyXfate 0:08606a13a816 207 bool operator== (const double val) const
destinyXfate 0:08606a13a816 208 {
destinyXfate 0:08606a13a816 209 return m_re == val && m_im == 0.;
destinyXfate 0:08606a13a816 210 }
destinyXfate 0:08606a13a816 211
destinyXfate 0:08606a13a816 212 bool operator!= (const double val) const
destinyXfate 0:08606a13a816 213 {
destinyXfate 0:08606a13a816 214 return m_re != val || m_im != 0.;
destinyXfate 0:08606a13a816 215 }
destinyXfate 0:08606a13a816 216
destinyXfate 0:08606a13a816 217 friend bool operator== (const double left, const complex& right)
destinyXfate 0:08606a13a816 218 {
destinyXfate 0:08606a13a816 219 return left == right.m_re && right.m_im == 0.;
destinyXfate 0:08606a13a816 220 }
destinyXfate 0:08606a13a816 221
destinyXfate 0:08606a13a816 222 friend bool operator!= (const double left, const complex& right)
destinyXfate 0:08606a13a816 223 {
destinyXfate 0:08606a13a816 224 return left != right.m_re || right.m_im != 0.;
destinyXfate 0:08606a13a816 225 }
destinyXfate 0:08606a13a816 226 };
destinyXfate 0:08606a13a816 227
destinyXfate 0:08606a13a816 228 #endif
destinyXfate 0:08606a13a816 229