return new Complex(value.re, -value.im);\r
}\r
\r
- public static Complex FromPolarCoordinates(double magnitude, double phase)\r
+ public static Complex Exp(Complex value)\r
+ {\r
+ double e = Math.Exp(value.Real);\r
+ double re = Math.Cos(value.Imaginary) * e;\r
+ double im = Math.Sin(value.Imaginary) * e;\r
+ return new Complex(re, im);\r
+ }\r
+\r
+ public static Complex FromPolarCoordinates(\r
+ double magnitude, double phase)\r
{\r
double re = magnitude * Math.Cos(phase);\r
double im = magnitude * Math.Sin(phase);\r
return new Complex(re, im);\r
}\r
\r
+ public static Complex Log(Complex value)\r
+ {\r
+ return new Complex(Math.Log(value.Magnitude), value.Phase);\r
+ }\r
+\r
+ public static Complex Pow(Complex value, double power)\r
+ {\r
+ if (value.Equals(Zero))\r
+ {\r
+ return Zero;\r
+ }\r
+ if (power == 0.0)\r
+ {\r
+ return One;\r
+ }\r
+ double m = Math.Pow(value.Magnitude, power);\r
+ double p = value.Phase * power;\r
+ return Complex.FromPolarCoordinates(m, p);\r
+ }\r
+\r
+ public static Complex Pow(Complex value, Complex power)\r
+ {\r
+ throw new NotImplementedException();\r
+ }\r
+\r
public override string ToString()\r
{\r
return "(" + re.ToString() + ", " + im.ToString() + ")";\r
[TestFixture]\r
public class ComplexTest\r
{\r
- private const double err = 1e-15;\r
+ private const double err = 3e-16;\r
[Test]\r
public void Construct()\r
{\r
public void Add()\r
{\r
Complex c = new Complex(1.2, 3.4) + new Complex(5.6, -7.8);\r
- Assert.AreEqual(6.8, c.Real, err);\r
- Assert.AreEqual(-4.4, c.Imaginary, err);\r
+ Complex e = new Complex(6.8, -4.4);\r
+ Assert.AreEqual(e.Real, c.Real, e.Real * err);\r
+ Assert.AreEqual(e.Imaginary, c.Imaginary, -e.Imaginary * err);\r
}\r
\r
[Test]\r
public void Sub()\r
{\r
Complex c = new Complex(1.2, 3.4) - new Complex(5.6, -7.8);\r
- Assert.AreEqual(-4.4, c.Real, err);\r
- Assert.AreEqual(11.2, c.Imaginary, err);\r
+ Complex e = new Complex(-4.4, 11.2);\r
+ Assert.AreEqual(e.Real, c.Real, -e.Real * err);\r
+ Assert.AreEqual(e.Imaginary, c.Imaginary, e.Imaginary * err);\r
}\r
\r
[Test]\r
public void Mul()\r
{\r
Complex c = new Complex(1.2, 3.4) * new Complex(5.6, -7.8);\r
- Assert.AreEqual(33.24, c.Real, err);\r
- Assert.AreEqual(9.68, c.Imaginary, err);\r
+ Complex e = new Complex(33.24, 9.68);\r
+ Assert.AreEqual(e.Real, c.Real, e.Real * err);\r
+ Assert.AreEqual(e.Imaginary, c.Imaginary, e.Imaginary * err);\r
}\r
\r
[Test]\r
public void Div()\r
{\r
Complex c = new Complex(1.2, 3.4) / new Complex(5.6, -7.8);\r
- Assert.AreEqual(-0.21475054229934922856, c.Real, err);\r
- Assert.AreEqual(0.30802603036876352594, c.Imaginary, err);\r
+ Complex e = new Complex(-0.21475054229934922856, \r
+ 0.30802603036876352594);\r
+ Assert.AreEqual(e.Real, c.Real, -e.Real * err);\r
+ Assert.AreEqual(e.Imaginary, c.Imaginary, e.Imaginary * err);\r
+ }\r
+\r
+ [Test]\r
+ public void Pow()\r
+ {\r
+ Complex zero = Complex.Pow(new Complex(0, 0), 0.0);\r
+ Assert.AreEqual(Complex.Zero, zero);\r
+\r
+ Complex one = Complex.Pow(new Complex(1.2, 3.4), 0.0);\r
+ Assert.AreEqual(Complex.One, one);\r
+\r
+ Complex dm = Complex.Pow(new Complex(1.2, 3.4), -7.8);\r
+ Complex dme = new Complex(-4.45114429517401687933e-5,\r
+ 8.14346575015576141544e-6);\r
+ Assert.AreEqual(dme.Real, dm.Real, -dme.Real * err);\r
+ Assert.AreEqual(dme.Imaginary, dm.Imaginary, dme.Imaginary * err);\r
+\r
+ Complex dp = Complex.Pow(new Complex(1.2, 3.4), 7.8);\r
+ Complex dpe = new Complex(-2.17385123970365202695e4,\r
+ -3.97710834394961921134e3);\r
+ Assert.AreEqual(dpe.Real, dp.Real, -dpe.Real * err);\r
+ Assert.AreEqual(dpe.Imaginary, dp.Imaginary, -dpe.Imaginary * err);\r
+ }\r
+\r
+ [Test]\r
+ public void Exp()\r
+ {\r
+ Complex one = Complex.Exp(Complex.Zero);\r
+ Assert.AreEqual(Complex.One, one);\r
+\r
+ Complex e1 = Complex.Exp(Complex.One);\r
+ Assert.AreEqual((Complex)Math.E, e1);\r
+\r
+ Complex ei = Complex.Exp(Complex.ImaginaryOne);\r
+ Complex eie = new Complex(Math.Cos(1.0), Math.Sin(1.0));\r
+ Assert.AreEqual(eie.Real, ei.Real, eie.Real * err);\r
+ Assert.AreEqual(eie.Imaginary, ei.Imaginary, eie.Imaginary * err);\r
+\r
+ Complex c = Complex.Exp(new Complex(1.2, 3.4));\r
+ Complex e = new Complex(-3.209883040054176017719,\r
+ -8.484263372940289427149e-1);\r
+ Assert.AreEqual(e.Real, c.Real, -e.Real * err);\r
+ Assert.AreEqual(e.Imaginary, c.Imaginary, -e.Imaginary * err);\r
+ }\r
+\r
+ [Test]\r
+ public void Log()\r
+ {\r
+ Complex nInf = Complex.Log(Complex.Zero);\r
+ Assert.AreEqual((Complex)Double.NegativeInfinity, nInf);\r
+\r
+ Complex zero = Complex.Log(Complex.One);\r
+ Assert.AreEqual(Complex.Zero, zero);\r
+\r
+ Complex li = Complex.Log(Complex.ImaginaryOne);\r
+ Complex lie = new Complex(0.0, Math.PI * 0.5);\r
+ Assert.AreEqual(lie.Real, li.Real);\r
+ Assert.AreEqual(lie.Imaginary, li.Imaginary, lie.Imaginary * err);\r
+\r
+ Complex c = Complex.Log(new Complex(1.2, 3.4));\r
+ Complex e = new Complex(1.2824746787307683693058,\r
+ 1.2315037123408518748846);\r
+ Assert.AreEqual(e.Real, c.Real, e.Real * err);\r
+ Assert.AreEqual(e.Imaginary, c.Imaginary, e.Imaginary * err);\r
}\r
}\r
}\r