Files
Just.PreciseMath/1-tests/Just.PreciseMath.Tests/SanityChecks/DoubleDoubleArithmeticEqualityChecks.cs
T
just 5797bf4884
.NET Test / .NET tests (push) Successful in 3m55s
added sanity checks
2026-09-18 14:10:24 +04:00

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