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);