@@ -0,0 +1,108 @@
|
||||
namespace Just.PreciseMath.Tests.SanityChecks;
|
||||
|
||||
public class DoubleDoubleArithmeticEqualityChecks
|
||||
{
|
||||
public static IEnumerable<TheoryDataRow<double>> 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user