109 lines
4.0 KiB
C#
109 lines
4.0 KiB
C#
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);
|
|
}
|
|
}
|