OSDN Git Service

Complexの機能充実(Pow(), Log(), Exp()実装)
authorkimikage <kimikage_ceo@hotmail.com>
Tue, 11 Jan 2011 10:40:34 +0000 (19:40 +0900)
committerkimikage <kimikage_ceo@hotmail.com>
Tue, 11 Jan 2011 10:40:34 +0000 (19:40 +0900)
Karinto/Complex.cs
KarintoTest/ComplexTest.cs

index 15df491..291672e 100755 (executable)
@@ -132,13 +132,47 @@ namespace Karinto
             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
index c164ee0..daa6069 100755 (executable)
@@ -17,7 +17,7 @@ namespace KarintoTest
     [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
@@ -52,32 +52,101 @@ namespace KarintoTest
         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