namespace Just.PreciseMath.Tests.SanityChecks; public class DoubleDoubleArithmeticEqualityChecks { public static IEnumerable> ReferenceCases => [1.0, 2.0, 3.0, 100.0, 0.1, 0.5, 0.333333333333333333, -1.0, 1553.0, 1.0e+10]; [Theory] [MemberData(nameof(ReferenceCases))] public void AdditionShouldProduceIdenticalResults(double reference) { DoubleDouble testValue = DoubleDouble.E; // any value with full precision range used DoubleDouble ddxdd_Result = testValue + (new DoubleDouble(reference)); DoubleDouble ddxd_Result = testValue + reference; DoubleDouble dxdd_Result = reference + testValue; ddxdd_Result.High.ShouldBe(ddxd_Result.High); ddxdd_Result.Low.ShouldBe(ddxd_Result.Low); ddxdd_Result.ShouldBe(ddxd_Result); ddxdd_Result.High.ShouldBe(dxdd_Result.High); ddxdd_Result.Low.ShouldBe(dxdd_Result.Low); ddxdd_Result.ShouldBe(dxdd_Result); ddxd_Result.High.ShouldBe(dxdd_Result.High); ddxd_Result.Low.ShouldBe(dxdd_Result.Low); ddxd_Result.ShouldBe(dxdd_Result); } [Theory] [MemberData(nameof(ReferenceCases))] public void SubtractionFromShouldProduceIdenticalResults(double reference) { DoubleDouble testValue = DoubleDouble.E; // any value with full precision range used DoubleDouble ddxdd_Result = testValue - (new DoubleDouble(reference)); DoubleDouble ddxd_Result = testValue - reference; ddxdd_Result.High.ShouldBe(ddxd_Result.High); ddxdd_Result.Low.ShouldBe(ddxd_Result.Low); ddxdd_Result.ShouldBe(ddxd_Result); } [Theory] [MemberData(nameof(ReferenceCases))] public void SubtractionShouldProduceIdenticalResults(double reference) { DoubleDouble testValue = DoubleDouble.E; // any value with full precision range used DoubleDouble ddxdd_Result = (new DoubleDouble(reference)) - testValue; DoubleDouble dxdd_Result = reference - testValue; ddxdd_Result.High.ShouldBe(dxdd_Result.High); ddxdd_Result.Low.ShouldBe(dxdd_Result.Low); ddxdd_Result.ShouldBe(dxdd_Result); } [Theory] [MemberData(nameof(ReferenceCases))] public void MultiplicationShouldProduceIdenticalResults(double reference) { DoubleDouble testValue = DoubleDouble.E; // any value with full precision range used DoubleDouble ddxdd_Result = testValue * (new DoubleDouble(reference)); DoubleDouble ddxd_Result = testValue * reference; DoubleDouble dxdd_Result = reference * testValue; ddxdd_Result.High.ShouldBe(ddxd_Result.High); ddxdd_Result.Low.ShouldBe(ddxd_Result.Low); ddxdd_Result.ShouldBe(ddxd_Result); ddxdd_Result.High.ShouldBe(dxdd_Result.High); ddxdd_Result.Low.ShouldBe(dxdd_Result.Low); ddxdd_Result.ShouldBe(dxdd_Result); ddxd_Result.High.ShouldBe(dxdd_Result.High); ddxd_Result.Low.ShouldBe(dxdd_Result.Low); ddxd_Result.ShouldBe(dxdd_Result); } [Theory] [MemberData(nameof(ReferenceCases))] public void DivisionShouldProduceIdenticalResults(double reference) { DoubleDouble testValue = DoubleDouble.E; // any value with full precision range used DoubleDouble ddxdd_Result = testValue / (new DoubleDouble(reference)); DoubleDouble ddxd_Result = testValue / reference; ddxdd_Result.High.ShouldBe(ddxd_Result.High); ddxdd_Result.Low.ShouldBe(ddxd_Result.Low); ddxdd_Result.ShouldBe(ddxd_Result); } [Theory] [MemberData(nameof(ReferenceCases))] public void DivisionByShouldProduceIdenticalResults(double reference) { DoubleDouble testValue = DoubleDouble.E; // any value with full precision range used DoubleDouble ddxdd_Result = (new DoubleDouble(reference)) / testValue; DoubleDouble dxdd_Result = reference / testValue; ddxdd_Result.High.ShouldBe(dxdd_Result.High); ddxdd_Result.Low.ShouldBe(dxdd_Result.Low); ddxdd_Result.ShouldBe(dxdd_Result); } }