|
|
|
@ -485,13 +485,66 @@ namespace MathNet.Numerics.UnitTests |
|
|
|
[Test] |
|
|
|
public void AlmostEqual() |
|
|
|
{ |
|
|
|
AssertEx.That(()=>1.0.AlmostEqual(1.0), "1.0 equals 1.0."); |
|
|
|
AssertEx.That(() => 1.0.AlmostEqual(1.0), "1.0 equals 1.0."); |
|
|
|
AssertEx.That(() => 1.0.AlmostEqual(1.0 + _doublePrecision), "1.0 equals 1.0 + 2^(-53)."); |
|
|
|
AssertEx.That(() => 1.0.AlmostEqual(1.0 + _doublePrecision * 10), "1.0 equals 1.0 + 2^(-52)."); |
|
|
|
AssertEx.That(() => !1.0.AlmostEqual(1.0 + _doublePrecision * 100), "1.0 does not equal 1.0 + 2^(-51)."); |
|
|
|
AssertEx.That(() => !1.0.AlmostEqual(2.0), "1.0 does not equal 2.0"); |
|
|
|
} |
|
|
|
|
|
|
|
[Test] |
|
|
|
public void AlmostEqualWithRelativeError() |
|
|
|
{ |
|
|
|
// compare zero and negative zero
|
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(0.0, -0.0, 1e-5)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(0.0, -0.0, 1e-15)); |
|
|
|
|
|
|
|
// compare two nearby numbers
|
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0, 1.0 + 3 * _doublePrecision, 1e-15)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0, 1.0 + _doublePrecision, 1e-15)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0, 1.0 + 1e-16, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0, 1.0 + 1e-15, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0, 1.0 + 1e-14, 1e-15)); |
|
|
|
|
|
|
|
// compare with the two numbers reversed in compare order
|
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0 + 3 * _doublePrecision, 1.0, 1e-15)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0 + _doublePrecision, 1.0, 1e-15)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0 + 1e-16, 1.0, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0 + 1e-15, 1.0, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0 + 1e-14, 1.0, 1e-15)); |
|
|
|
|
|
|
|
// compare different numbers
|
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(2.0, 1.0, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0, 2.0, 1e-15)); |
|
|
|
|
|
|
|
// compare different numbers with large tolerance
|
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(2.0, 1.0, 1e-5)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0, 2.0, 1e-5)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(2.0, 1.0, 1e+1)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(1.0, 2.0, 1e+1)); |
|
|
|
|
|
|
|
// compare inf & inf
|
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(double.PositiveInfinity, double.PositiveInfinity, 1e-15)); |
|
|
|
Assert.IsTrue(Precision.AlmostEqualWithRelativeError(double.NegativeInfinity, double.NegativeInfinity, 1e-15)); |
|
|
|
|
|
|
|
// compare -inf and inf
|
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(double.PositiveInfinity, double.NegativeInfinity, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(double.NegativeInfinity, double.PositiveInfinity, 1e-15)); |
|
|
|
|
|
|
|
// compare inf and non-inf
|
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(double.PositiveInfinity, 1.0, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0, double.PositiveInfinity, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(double.NegativeInfinity, 1.0, 1e-15)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1.0, double.NegativeInfinity, 1e-15)); |
|
|
|
|
|
|
|
// compare tiny numbers with opposite signs
|
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(1e-12, -1e-12, 1e-14)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(-1e-12, 1e-12, 1e-14)); |
|
|
|
|
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(-2.0, 2.0, 1e-14)); |
|
|
|
Assert.IsFalse(Precision.AlmostEqualWithRelativeError(2.0, -2.0, 1e-14)); |
|
|
|
} |
|
|
|
|
|
|
|
[Test] |
|
|
|
public void AlmostEqualWithMaxNumbersBetween() |
|
|
|
{ |
|
|
|
|