From ff9fda060da203491eb0336ca4aeba3ad5b9c8d6 Mon Sep 17 00:00:00 2001 From: kimikage Date: Thu, 10 Nov 2011 20:18:56 +0900 Subject: [PATCH] =?utf8?q?Abs()=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Karinto/Numeric/Operator.cs | 24 +++++++++++++++++++++++ KarintoTest/NumericTest/OperatorTest.cs | 34 ++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Karinto/Numeric/Operator.cs b/Karinto/Numeric/Operator.cs index 44f789b..f5be42c 100755 --- a/Karinto/Numeric/Operator.cs +++ b/Karinto/Numeric/Operator.cs @@ -22,7 +22,18 @@ namespace Karinto.Numeric public static BinaryOperator Mul; public static BinaryOperator Div; public static UnaryOperator Neg; + public static UnaryOperator Abs; + + /// + /// 加法単位元 + /// + /// Tが参照型の場合,Zeroに破壊的操作をしてはならない public static T Zero; + + /// + /// 乗法単位元 + /// + /// Tが参照型の場合,Oneに破壊的操作をしてはならない public static T One; private static BinaryOperator invalidOp2 = @@ -64,6 +75,7 @@ namespace Karinto.Numeric { return -number; }; + Operator.Abs = Math.Abs; return; } if (prototype is long) @@ -90,6 +102,7 @@ namespace Karinto.Numeric { return -number; }; + Operator.Abs = Math.Abs; return; } if (prototype is decimal) @@ -116,6 +129,7 @@ namespace Karinto.Numeric { return -number; }; + Operator.Abs = Math.Abs; return; } if (prototype is double) @@ -142,6 +156,7 @@ namespace Karinto.Numeric { return -number; }; + Operator.Abs = Math.Abs; return; } if (prototype is float) @@ -168,6 +183,7 @@ namespace Karinto.Numeric { return -number; }; + Operator.Abs = Math.Abs; return; } Add = invalidOp2; @@ -178,6 +194,14 @@ namespace Karinto.Numeric { return Sub(Zero, number); }; + Abs = delegate(T number) + { + if (number.CompareTo(Zero) < 0) + { + return Neg(number); + } + return number; + }; } } } diff --git a/KarintoTest/NumericTest/OperatorTest.cs b/KarintoTest/NumericTest/OperatorTest.cs index 9713f75..17307e9 100755 --- a/KarintoTest/NumericTest/OperatorTest.cs +++ b/KarintoTest/NumericTest/OperatorTest.cs @@ -62,7 +62,11 @@ namespace KarintoTest.NumericTest public int CompareTo(Object value) { - return number.CompareTo(value); + if (!(value is MyNumber)) + { + throw new ArgumentException(); + } + return number.CompareTo(((MyNumber)value).number); } } @@ -89,6 +93,9 @@ namespace KarintoTest.NumericTest Assert.AreEqual(left * right, I4.Mul(left, right)); Assert.AreEqual(left / right, I4.Div(left, right)); Assert.AreEqual(-left, I4.Neg(left)); + Assert.AreEqual(0, I4.Abs(0)); + Assert.AreEqual(Math.Abs(left - right), I4.Abs(left - right)); + Assert.AreEqual(Math.Abs(right - left), I4.Abs(right - left)); } [TestCase(123456789012345L, 67890123L)] @@ -101,6 +108,9 @@ namespace KarintoTest.NumericTest Assert.AreEqual(left * right, I8.Mul(left, right)); Assert.AreEqual(left / right, I8.Div(left, right)); Assert.AreEqual(-left, I8.Neg(left)); + Assert.AreEqual(0L, I8.Abs(0L)); + Assert.AreEqual(Math.Abs(left - right), I8.Abs(left - right)); + Assert.AreEqual(Math.Abs(right - left), I8.Abs(right - left)); } [Test] @@ -115,6 +125,9 @@ namespace KarintoTest.NumericTest Assert.AreEqual(left * right, M.Mul(left, right)); Assert.AreEqual(left / right, M.Div(left, right)); Assert.AreEqual(-left, M.Neg(left)); + Assert.AreEqual(0.0m, M.Abs(0.0m)); + Assert.AreEqual(Math.Abs(left - right), M.Abs(left - right)); + Assert.AreEqual(Math.Abs(right - left), M.Abs(right - left)); } [TestCase(1234.5f, 67.8e-9f)] @@ -127,6 +140,9 @@ namespace KarintoTest.NumericTest Assert.AreEqual(left * right, F4.Mul(left, right)); Assert.AreEqual(left / right, F4.Div(left, right)); Assert.AreEqual(-left, F4.Neg(left)); + Assert.AreEqual(0.0f, F4.Abs(0.0f)); + Assert.AreEqual(Math.Abs(left - right), F4.Abs(left - right)); + Assert.AreEqual(Math.Abs(right - left), F4.Abs(right - left)); } [TestCase(1234.5, 67.8e-9)] @@ -139,6 +155,9 @@ namespace KarintoTest.NumericTest Assert.AreEqual(left * right, F8.Mul(left, right)); Assert.AreEqual(left / right, F8.Div(left, right)); Assert.AreEqual(-left, F8.Neg(left)); + Assert.AreEqual(0.0, F8.Abs(0.0)); + Assert.AreEqual(Math.Abs(left - right), F8.Abs(left - right)); + Assert.AreEqual(Math.Abs(right - left), F8.Abs(right - left)); } [Test] @@ -157,24 +176,29 @@ namespace KarintoTest.NumericTest MyNumber left = new MyNumber(1234.5); MyNumber right = new MyNumber(67.8); + MyNumber zero = left - left; Assert.AreEqual(0, (int)Operator.Zero); Assert.AreEqual(1, (int)Operator.One); Assert.AreEqual(left + right, Operator.Add(left, right)); Assert.AreEqual(left - right, Operator.Sub(left, right)); - Assert.AreEqual(left - left - left, Operator.Neg(left)); + Assert.AreEqual(zero - left, Operator.Neg(left)); + Assert.AreEqual(zero, Operator.Abs(zero)); + Assert.AreEqual(left - right, Operator.Abs(left - right)); + Assert.AreEqual(left - right, Operator.Abs(right - left)); } [Test] public void CheckSpeed() { - int m = 10240; + const int m = 10240; int n = random.Length; int v1 = 1; I4.Add(1, 1); // dummy - DateTime start = DateTime.Now; + DateTime start; + start = DateTime.Now; for (int j = 0; j < m; ++j) { for (int i = 1; i < n; ++i) @@ -196,7 +220,7 @@ namespace KarintoTest.NumericTest TimeSpan dt2 = DateTime.Now - start; Assert.AreEqual(v1, v2); - Assert.Less(dt2.Ticks * 0.1, dt1.Ticks); + Assert.Less(dt2.Ticks, dt1.Ticks * 10); } } -- 2.11.0