diff --git a/PreciseNumber.Test/PreciseNumberTests.cs b/PreciseNumber.Test/PreciseNumberTests.cs index 10ea1d1..f586969 100644 --- a/PreciseNumber.Test/PreciseNumberTests.cs +++ b/PreciseNumber.Test/PreciseNumberTests.cs @@ -608,7 +608,7 @@ public void TestStaticMinMagnitude() PreciseNumber one = PreciseNumber.One; PreciseNumber negativeOne = PreciseNumber.NegativeOne; PreciseNumber result = PreciseNumber.MinMagnitude(one, negativeOne); - Assert.AreEqual(one, result); + Assert.AreEqual(negativeOne, result); } [TestMethod] @@ -617,7 +617,35 @@ public void TestStaticMinMagnitudeNumber() PreciseNumber one = PreciseNumber.One; PreciseNumber negativeOne = PreciseNumber.NegativeOne; PreciseNumber result = PreciseNumber.MinMagnitudeNumber(one, negativeOne); - Assert.AreEqual(one, result); + Assert.AreEqual(negativeOne, result); + } + + [TestMethod] + [DataRow(-2, 2)] + [DataRow(2, -2)] + public void TestMagnitudeTiesFollowInt(int x, int y) + { + PreciseNumber px = x.ToPreciseNumber(); + PreciseNumber py = y.ToPreciseNumber(); + + Assert.AreEqual(int.MaxMagnitude(x, y).ToPreciseNumber(), PreciseNumber.MaxMagnitude(px, py)); + Assert.AreEqual(int.MaxMagnitude(x, y).ToPreciseNumber(), PreciseNumber.MaxMagnitudeNumber(px, py)); + Assert.AreEqual(int.MinMagnitude(x, y).ToPreciseNumber(), PreciseNumber.MinMagnitude(px, py)); + Assert.AreEqual(int.MinMagnitude(x, y).ToPreciseNumber(), PreciseNumber.MinMagnitudeNumber(px, py)); + } + + [TestMethod] + [DataRow(-3, 2)] + [DataRow(2, -3)] + [DataRow(3, -2)] + [DataRow(-2, 3)] + public void TestMagnitudeWithoutATiePicksByAbsoluteValue(int x, int y) + { + PreciseNumber px = x.ToPreciseNumber(); + PreciseNumber py = y.ToPreciseNumber(); + + Assert.AreEqual(int.MaxMagnitude(x, y).ToPreciseNumber(), PreciseNumber.MaxMagnitude(px, py)); + Assert.AreEqual(int.MinMagnitude(x, y).ToPreciseNumber(), PreciseNumber.MinMagnitude(px, py)); } [TestMethod] diff --git a/PreciseNumber/PreciseNumber.cs b/PreciseNumber/PreciseNumber.cs index fc17624..8bffab1 100644 --- a/PreciseNumber/PreciseNumber.cs +++ b/PreciseNumber/PreciseNumber.cs @@ -1097,15 +1097,37 @@ public static bool IsZero(PreciseNumber value) => value.Significand == 0; /// - public static PreciseNumber MaxMagnitude(PreciseNumber x, PreciseNumber y) => - x.Abs() >= y.Abs() ? x : y; + /// + /// When the magnitudes are equal, the positive value is returned, as for and . + /// + public static PreciseNumber MaxMagnitude(PreciseNumber x, PreciseNumber y) + { + int comparison = x.Abs().CompareTo(y.Abs()); + if (comparison != 0) + { + return comparison > 0 ? x : y; + } + + return IsNegative(x) ? y : x; + } /// public static PreciseNumber MaxMagnitudeNumber(PreciseNumber x, PreciseNumber y) => MaxMagnitude(x, y); /// - public static PreciseNumber MinMagnitude(PreciseNumber x, PreciseNumber y) => - x.Abs() <= y.Abs() ? x : y; + /// + /// When the magnitudes are equal, the negative value is returned, as for and . + /// + public static PreciseNumber MinMagnitude(PreciseNumber x, PreciseNumber y) + { + int comparison = x.Abs().CompareTo(y.Abs()); + if (comparison != 0) + { + return comparison < 0 ? x : y; + } + + return IsNegative(x) ? x : y; + } /// public static PreciseNumber MinMagnitudeNumber(PreciseNumber x, PreciseNumber y) => MinMagnitude(x, y);