pow, log and exp
.NET Test / .NET tests (push) Successful in 1m31s

This commit is contained in:
2026-09-15 00:33:31 +04:00
parent beb9a084d0
commit b54a0a2d42
18 changed files with 2890 additions and 12 deletions
@@ -0,0 +1,110 @@
using System.Globalization;
using System.Numerics;
using Just.PreciseMath.Tests.ReferenceData;
using Shouldly;
using Xunit;
namespace Just.PreciseMath.Tests;
public class PreciseMathExpTests
{
public static IEnumerable<TheoryDataRow<double, double, string, bool, bool>> ReferenceCases => ExpReferenceData.Cases();
[Theory]
[MemberData(nameof(ReferenceCases))]
public void FiniteInputsMeetIndependentReferenceBound(double high, double low, string reference,
bool overflow, bool underflow)
{
// Decimal.exp at 180/260 digits, rounded to 120 digits by generate_exp.py.
// Inputs are exact stored binary64 sums, not rounded irrational constants.
DoubleDouble input = DoubleDouble.FromComponents(high, low);
(Units(input.High) + Units(input.Low)).ShouldBe(Units(high) + Units(low));
DoubleDouble actual = DDMath.Exp(input);
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
if (overflow)
{
actual.High.ShouldBe(double.PositiveInfinity);
return;
}
if (underflow)
{
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(0L);
return;
}
DoubleDouble.IsFinite(actual).ShouldBeTrue();
(actual.High > 0.0).ShouldBeTrue();
string[] parts = reference.Split('e');
int point = parts[0].IndexOf('.', StringComparison.Ordinal);
int decimals = point < 0 ? 0 : parts[0].Length - point - 1;
BigInteger numerator = BigInteger.Parse(parts[0].Replace(".", "", StringComparison.Ordinal), CultureInfo.InvariantCulture);
int exponent = int.Parse(parts[1], CultureInfo.InvariantCulture) - decimals;
BigInteger denominator = BigInteger.One;
if (exponent >= 0)
{
numerator *= BigInteger.Pow(10, exponent);
}
else
{
denominator = BigInteger.Pow(10, -exponent);
}
BigInteger actualUnits = Units(actual.High) + Units(actual.Low);
BigInteger error = BigInteger.Abs((actualUnits * denominator) - (numerator << 1074));
// Contract: 2^-100 relative + one minimum subnormal. The independent
// decimal reference error is < 2^-350 relative; include it explicitly.
BigInteger bound = (numerator << 1324) + (denominator << 350) + (numerator << 1074);
((error << 350) <= bound).ShouldBeTrue(
$"Exp bound failed for ({high:R}, {low:R}): ({actual.High:R}, {actual.Low:R})");
}
[Theory]
[InlineData(-740.0, 85L)]
[InlineData(-745.131, 1L)]
public void LegacySubnormalResultsRoundToTheExpectedUnits(double input, long expectedBits)
{
// Independently round Decimal.exp(exact binary64 input)/2^-1074 to an
// integer at 180 digits. Pin more than the general one-subnormal bound.
DoubleDouble actual = DDMath.Exp(new DoubleDouble(input));
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(expectedBits);
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(0L);
}
[Theory]
[InlineData(709.5)]
[InlineData(709.781)]
public void LegacyFiniteResultsDoNotOverflowPrematurely(double input)
{
DoubleDouble actual = DDMath.Exp(new DoubleDouble(input));
DoubleDouble.IsFinite(actual).ShouldBeTrue();
actual.Low.ShouldNotBe(0.0);
// Component-aware accuracy for these exact inputs is pinned by ReferenceCases.
}
[Fact]
public void SpecialValuesAreHandledBeforeRangeReduction()
{
double[] inputs = [0.0, -0.0, double.NaN, double.PositiveInfinity, double.NegativeInfinity,
double.MaxValue, double.MinValue];
foreach (double input in inputs)
{
DoubleDouble actual = DDMath.Exp(new DoubleDouble(input));
double expected = Math.Exp(input);
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(
BitConverter.DoubleToInt64Bits(double.IsNaN(expected) ? double.NaN : expected));
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(0L);
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
}
}
private static BigInteger Units(double value)
{
long bits = BitConverter.DoubleToInt64Bits(value);
int exponent = (int)((bits >> 52) & 0x7ff);
BigInteger significand = bits & 0xfffffffffffffL;
if (exponent != 0)
{
significand += BigInteger.One << 52;
significand <<= exponent - 1;
}
return bits < 0 ? -significand : significand;
}
}
@@ -0,0 +1,146 @@
using System.Globalization;
using System.Numerics;
using Just.PreciseMath.Tests.ReferenceData;
using Shouldly;
using Xunit;
namespace Just.PreciseMath.Tests;
public class PreciseMathLogTests
{
public static IEnumerable<TheoryDataRow<string, double, double, string>> ReferenceCases => LogReferenceData.Cases();
[Fact]
public void SpecialValuesHaveExplicitCanonicalResults()
{
// Legacy Log(0) reached Exp(-Infinity) and threw. Domain handling must
// precede finite range reduction, with either zero mapping to -Infinity.
double[] values = [0.0, -0.0, 1.0, -1.0, -double.Epsilon, double.MinValue,
double.PositiveInfinity, double.NegativeInfinity, double.NaN];
foreach (double value in values)
{
DoubleDouble expected = new(Math.Log(value));
AssertBits(DDMath.Log(new DoubleDouble(value)), expected.High, 0.0);
}
DoubleDouble negative = DoubleDouble.FromComponents(-1.0, Math.ScaleB(1.0, -54));
AssertBits(DDMath.Log(negative), double.NaN, 0.0);
}
[Theory]
[MemberData(nameof(ReferenceCases))]
public void FiniteInputsMeetIndependentReferenceBound(string label, double high, double low, string reference)
{
// Decimal.ln at 450/650 digits, from exact component sums formed at
// 2200 digits and checked with Fraction. No binary64 log supplies the oracle.
DoubleDouble input = DoubleDouble.FromComponents(high, low);
(Units(input.High) + Units(input.Low)).ShouldBe(Units(high) + Units(low));
DoubleDouble actual = DDMath.Log(input);
AssertReferenceBound(actual, reference, 1, $"{label}: ({high:R}, {low:R})");
if (input == DoubleDouble.One)
{
AssertBits(actual, 0.0, 0.0);
}
else
{
Math.Sign(actual.High).ShouldBe(input > DoubleDouble.One ? 1 : -1);
}
}
[Fact]
public void PowersOfTwoCoverEveryFiniteBinaryInputExponent()
{
// ln(2^k) = k*ln(2). Multiply the independent decimal reference by k
// with exact integers, never using the library constant or DD arithmetic.
for (int exponent = -1074; exponent <= 1023; ++exponent)
{
DoubleDouble input = new(Math.ScaleB(1.0, exponent));
AssertReferenceBound(DDMath.Log(input), LogReferenceData.Ln2, exponent, $"2^{exponent}");
}
}
[Theory]
[InlineData(1e308)]
[InlineData(double.MaxValue)]
[InlineData(1e-308)]
public void ExtremeFiniteInputsRetainExtendedPrecisionWithoutDenominatorOverflow(double input)
{
// The legacy Log(1e308) formed u+value and overflowed. The finite
// kernel must reduce the mantissa before constructing its denominator.
DoubleDouble actual = DDMath.Log(new DoubleDouble(input));
DoubleDouble.IsFinite(actual).ShouldBeTrue();
actual.Low.ShouldNotBe(0.0);
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
// ReferenceCases independently pins the complete result for these inputs.
}
[Fact]
public void NearOneRetainsSparseCorrectionsOfEitherSign()
{
foreach (double sign in new[] { -1.0, 1.0 })
{
AssertBits(DDMath.Log(DoubleDouble.FromComponents(1.0, sign * double.Epsilon)),
sign * double.Epsilon, 0.0);
double delta = sign * Math.ScaleB(1.0, -500);
// ln(1+d) = d-d^2/2+O(d^3). Here the cubic tail is below half
// the minimum subnormal, so these two binary components are exact.
AssertBits(DDMath.Log(DoubleDouble.FromComponents(1.0, delta)),
delta, -Math.ScaleB(1.0, -1001));
}
}
[Fact]
public void ArbitraryPairsAreNormalizedByThePublicFactoryBeforeLog()
{
DoubleDouble positive = DoubleDouble.FromComponents(0.0, 2.0);
AssertReferenceBound(DDMath.Log(positive), LogReferenceData.Ln2, 1, "zero-high public construction");
AssertBits(DDMath.Log(DoubleDouble.FromComponents(0.0, -2.0)), double.NaN, 0.0);
}
private static void AssertReferenceBound(DoubleDouble actual, string reference, int factor, string context)
{
DoubleDouble.IsFinite(actual).ShouldBeTrue(context);
DoubleDouble.IsCanonical(actual).ShouldBeTrue(context);
string[] parts = reference.Split('e');
int point = parts[0].IndexOf('.', StringComparison.Ordinal);
int decimals = point < 0 ? 0 : parts[0].Length - point - 1;
BigInteger numerator = factor * BigInteger.Parse(parts[0].Replace(".", "", StringComparison.Ordinal), CultureInfo.InvariantCulture);
int exponent = int.Parse(parts[1], CultureInfo.InvariantCulture) - decimals;
BigInteger denominator = BigInteger.One;
if (exponent >= 0)
{
numerator *= BigInteger.Pow(10, exponent);
}
else
{
denominator = BigInteger.Pow(10, -exponent);
}
BigInteger actualUnits = Units(actual.High) + Units(actual.Low);
BigInteger error = BigInteger.Abs((actualUnits * denominator) - (numerator << 1074));
BigInteger magnitude = BigInteger.Abs(numerator);
// 2^-100 relative + one minimum subnormal, with independent reference
// uncertainty <2^-350 relative explicitly included. No component collapse.
BigInteger bound = (magnitude << 1324) + (denominator << 350) + (magnitude << 1074);
((error << 350) <= bound).ShouldBeTrue(
$"Log bound failed for {context}: ({actual.High:R}, {actual.Low:R})");
}
private static BigInteger Units(double value)
{
long bits = BitConverter.DoubleToInt64Bits(value);
int exponent = (int)((bits >> 52) & 0x7ff);
BigInteger significand = bits & 0xfffffffffffffL;
if (exponent != 0)
{
significand += BigInteger.One << 52;
significand <<= exponent - 1;
}
return bits < 0 ? -significand : significand;
}
private static void AssertBits(DoubleDouble actual, double high, double low)
{
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(BitConverter.DoubleToInt64Bits(high));
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(BitConverter.DoubleToInt64Bits(low));
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
}
}
@@ -0,0 +1,283 @@
using System.Numerics;
using Shouldly;
using Xunit;
namespace Just.PreciseMath.Tests;
public class PreciseMathPowTests
{
[Fact]
public void NegativePowerDoesNotOverflowBeforeReciprocation()
{
// Legacy review: Pow(2, -1024) overflowed before taking the reciprocal.
DoubleDouble actual = DDMath.Pow(new DoubleDouble(2.0), -1024);
AssertBits(actual, Math.ScaleB(1.0, -1024), 0.0);
}
[Fact]
public void MinimumIntegerExponentDoesNotOverflowItsMagnitude()
{
AssertBits(DDMath.Pow(DoubleDouble.One, int.MinValue), 1.0, 0.0);
AssertBits(DDMath.Pow(DoubleDouble.NegativeOne, int.MinValue), 1.0, 0.0);
AssertBits(DDMath.Pow(new DoubleDouble(2.0), int.MinValue), 0.0, 0.0);
AssertBits(DDMath.Pow(new DoubleDouble(0.5), int.MinValue), double.PositiveInfinity, 0.0);
}
[Fact]
public void PowerOnePreservesEvenAnExtremelySparseLow()
{
foreach (double sign in new[] { -1.0, 1.0 })
{
DoubleDouble input = DoubleDouble.FromComponents(sign * double.MaxValue, sign * double.Epsilon);
AssertBits(DDMath.Pow(input, 1), input.High, input.Low);
}
}
[Fact]
public void SpecialValuesFollowIntegerPowerRulesWithCanonicalBits()
{
double[] inputs = [0.0, -0.0, double.PositiveInfinity, double.NegativeInfinity,
double.NaN, 1.0, -1.0];
int[] exponents = [int.MinValue, int.MinValue + 1, -1025, -2, -1, 0, 1, 2, 1025, int.MaxValue];
foreach (double input in inputs)
{
foreach (int exponent in exponents)
{
// Every int converts exactly to double. BCL is an independent
// special-value/sign oracle, not the finite precision oracle.
double expected = Math.Pow(input, exponent);
AssertBits(DDMath.Pow(new DoubleDouble(input), exponent),
double.IsNaN(expected) ? double.NaN : expected, 0.0);
}
}
}
[Fact]
public void BinaryPowersAreExactAcrossInputAndOutputExponentRanges()
{
int[] powers = [int.MinValue, int.MinValue + 1, -1075, -1024, -3, -2, -1,
0, 1, 2, 3, 1024, 1075, int.MaxValue];
for (int inputExponent = -1074; inputExponent <= 1023; ++inputExponent)
{
foreach (int power in powers)
{
long outputExponent = (long)inputExponent * power;
double magnitude = outputExponent > 1023 ? double.PositiveInfinity
: outputExponent < -1074 ? 0.0 : Math.ScaleB(1.0, (int)outputExponent);
foreach (double sign in new[] { -1.0, 1.0 })
{
double expected = sign < 0.0 && (power & 1) != 0 ? -magnitude : magnitude;
AssertBits(DDMath.Pow(new DoubleDouble(sign * Math.ScaleB(1.0, inputExponent)), power),
expected, 0.0);
}
}
}
}
[Fact]
public void FinitePowersMeetAnIndependentExactRationalErrorBound()
{
// Exact binary input sums, raised with BigInteger arithmetic; no DD
// multiplication/division, decimal, or Math.Pow supplies the oracle.
Random random = new(270718);
for (int sample = 0; sample < 100; ++sample)
{
int scale = random.Next(-12, 13);
double high = Math.ScaleB(1.0 + random.NextDouble(), scale);
double low = Math.ScaleB(random.NextDouble(), scale - 54);
foreach (double residual in new[] { 0.0, low, -low })
{
DoubleDouble input = DoubleDouble.FromComponents(sample % 2 == 0 ? high : -high, residual);
foreach (int exponent in new[] { -63, -7, -2, -1, 1, 2, 7, 63 })
{
AssertExactPowerBound(input, exponent);
}
}
}
foreach (DoubleDouble input in new[] {
DoubleDouble.FromComponents(1.0, Math.ScaleB(1.0, -53)),
DoubleDouble.FromComponents(1.0, -Math.ScaleB(1.0, -54)),
DoubleDouble.FromComponents(0.5, double.Epsilon) })
{
foreach (int exponent in new[] { -1024, -257, 257, 1024 })
{
if (input.High == 0.5 && exponent == -1024)
{
continue; // Overflow is pinned by the binary-power matrix.
}
AssertExactPowerBound(input, exponent);
}
}
}
[Fact]
public void NegativePowersRetainRepresentableLowsAtExtremeInputMagnitudes()
{
foreach (int scale in new[] { -1023, -1000, -500, 500, 1000, 1023 })
{
foreach (double sign in new[] { -1.0, 1.0 })
{
DoubleDouble input = DoubleDouble.FromComponents(Math.ScaleB(1.5, scale),
sign * Math.ScaleB(1.0, scale - 54));
AssertExactPowerBound(input, -1);
if (scale == -500 || scale == 500)
{
DoubleDouble actual = DDMath.Pow(input, -2);
actual.Low.ShouldNotBe(0.0);
AssertExactPowerBound(input, -2);
}
if (scale < 0)
{
DDMath.Pow(input, -1).Low.ShouldNotBe(0.0);
}
}
}
AssertExactPowerBound(new DoubleDouble(double.MaxValue), -1);
AssertExactPowerBound(new DoubleDouble(1e-308), -1);
AssertExactPowerBound(new DoubleDouble(1e308), -1);
}
[Fact]
public void SparseReciprocalCorrectionsSurviveBothRangeDirections()
{
// 1/(h+l) = 1/h - l/h^2 + O(l^2/h^3). In these dyadic
// cases the remainder is strictly below half an ulp of the stated low.
foreach (double sign in new[] { -1.0, 1.0 })
{
DoubleDouble tiny = DoubleDouble.FromComponents(Math.ScaleB(1.0, -500), sign * double.Epsilon);
AssertBits(DDMath.Pow(tiny, -1), Math.ScaleB(1.0, 500), -sign * Math.ScaleB(1.0, -74));
DoubleDouble huge = DoubleDouble.FromComponents(Math.ScaleB(1.0, 500), sign * Math.ScaleB(1.0, -74));
AssertBits(DDMath.Pow(huge, -1), Math.ScaleB(1.0, -500), -sign * double.Epsilon);
DoubleDouble tinySquare = DoubleDouble.FromComponents(Math.ScaleB(1.0, -250), sign * double.Epsilon);
AssertBits(DDMath.Pow(tinySquare, -2), Math.ScaleB(1.0, 500), -sign * Math.ScaleB(1.0, -323));
}
}
[Fact]
public void UnderflowMidpointAndAdjacentLowComponentsRespectBothSigns()
{
// (2^-215)^5 = 2^-1075, exactly the tie between zero and epsilon.
// The low perturbations strictly bracket the tie; reciprocals of
// the corresponding large inputs reverse the perturbation direction.
foreach (int exponent in new[] { -5, 5 })
{
int scale = exponent < 0 ? 215 : -215;
foreach (double lowSign in new[] { -1.0, 0.0, 1.0 })
{
bool aboveTie = lowSign * exponent > 0.0;
foreach (double sign in new[] { -1.0, 1.0 })
{
DoubleDouble input = DoubleDouble.FromComponents(sign * Math.ScaleB(1.0, scale),
sign * lowSign * Math.ScaleB(1.0, scale - 54));
AssertBits(DDMath.Pow(input, exponent), sign * (aboveTie ? double.Epsilon : 0.0), 0.0);
}
}
}
}
[Fact]
public void OverflowBoundaryUsesTheLowComponentBeforeFinalScaling()
{
foreach (int exponent in new[] { -4, 4 })
{
int scale = exponent < 0 ? -256 : 256;
double lowSign = exponent < 0 ? 1.0 : -1.0;
DoubleDouble finite = DoubleDouble.FromComponents(Math.ScaleB(1.0, scale),
lowSign * Math.ScaleB(1.0, scale - 55));
AssertExactPowerBound(finite, exponent);
DoubleDouble overflowing = DoubleDouble.FromComponents(Math.ScaleB(1.0, scale),
lowSign * Math.ScaleB(1.0, scale - 57));
AssertBits(DDMath.Pow(overflowing, exponent), double.PositiveInfinity, 0.0);
}
}
[Theory]
// ReferenceData/generate_pow_reference.py: exact stored binary inputs,
// Decimal integer powers at 160/240 digits, stable floor(value * 10^100).
[InlineData(1.0, 5.551115123125783e-17, -2147483648, "9999998807907175546458285654165775755995358529592462953428551373115894598504056800747655101172369356")]
[InlineData(1.0, 5.551115123125783e-17, 2147483647, "10000001192092966006977287879000612242425055148009778363959373202290565261791488930669591094667385585")]
[InlineData(1.0, -5.551115123125783e-17, -2147483648, "10000001192092966562088932540488693037989493813706046557380379233423355139596032355926918800247828081")]
[InlineData(1.0, -5.551115123125783e-17, 2147483647, "9999998807907176101569665617857901211208198096053270077732977033266503983279402161561236649189617033")]
[InlineData(1.0000000009313226, 5.169878828456423e-26, -2147483648, "1353352833626534812694377803744507919692475898909062344519276068330639808800815294171180036409012889")]
[InlineData(1.0000000009313226, 5.169878828456423e-26, 2147483647, "73890560851674615678069694043352842890214309016451211229831428411840370567020651340427147012473005377")]
[InlineData(0.9999999990686774, -5.169878828456423e-26, -2147483648, "73890561058122458050918958513594285934973647528626440535855911314733978878721028315311791064891371241")]
[InlineData(0.9999999990686774, -5.169878828456423e-26, 2147483647, "1353352832366126768492006308656122646859542550999041350022637326283256718420076811410419433559508500")]
[InlineData(1.00000003, 2.7755575615628914e-17, -2147483648, "1049038452726052018566777293807106599923174085199532650373208349817256939")]
[InlineData(1.00000003, 2.7755575615628914e-17, 2147483647, "95325387491886611267179809406372425766774105569877060927978408348321633401745440609674655439897287007094693160193846818457460816")]
public void ExtremeIntegerExponentsMeetHighPrecisionReferenceIntervals(
double high, double low, int exponent, string lowerNumerator)
{
BigInteger numerator = BigInteger.Parse(lowerNumerator, System.Globalization.CultureInfo.InvariantCulture);
BigInteger denominator = BigInteger.Pow(10, 100);
foreach (double sign in new[] { -1.0, 1.0 })
{
DoubleDouble input = DoubleDouble.FromComponents(sign * high, sign * low);
DoubleDouble actual = DDMath.Pow(input, exponent);
actual.Low.ShouldNotBe(0.0);
int resultSign = sign < 0.0 && (exponent & 1) != 0 ? -1 : 1;
// Check both interval endpoints so the reference uncertainty is not
// silently omitted from the claimed exponent-dependent tolerance.
AssertRationalBound(actual, resultSign * numerator, denominator, exponent, lowerNumerator);
AssertRationalBound(actual, resultSign * (numerator + 1), denominator, exponent, lowerNumerator);
}
}
private static void AssertExactPowerBound(DoubleDouble input, int exponent)
{
BigInteger numerator = Units(input.High) + Units(input.Low);
int trailing = (int)BigInteger.TrailingZeroCount(BigInteger.Abs(numerator));
numerator >>= trailing;
BigInteger denominator = BigInteger.One;
if (trailing <= 1074)
{
denominator <<= 1074 - trailing;
}
else
{
numerator <<= trailing - 1074;
}
int magnitude = Math.Abs(exponent); // This oracle is used only for small exponents.
numerator = BigInteger.Pow(numerator, magnitude);
denominator = BigInteger.Pow(denominator, magnitude);
if (exponent < 0)
{
(numerator, denominator) = (denominator * numerator.Sign, BigInteger.Abs(numerator));
}
AssertRationalBound(DDMath.Pow(input, exponent), numerator, denominator, exponent,
$"({input.High:R}, {input.Low:R})^{exponent}");
}
private static void AssertRationalBound(DoubleDouble actual, BigInteger numerator,
BigInteger denominator, int exponent, string context)
{
DoubleDouble.IsFinite(actual).ShouldBeTrue(context);
DoubleDouble.IsCanonical(actual).ShouldBeTrue(context);
BigInteger actualUnits = Units(actual.High) + Units(actual.Low);
BigInteger error = BigInteger.Abs(actualUnits * denominator - (numerator << 1074));
// |actual-exact| <= |exact|*(|n|+1)*2^-100 + 2^-1074,
// cross-multiplied exactly in units of the smallest subnormal.
BigInteger tolerance = (BigInteger.Abs(numerator) * (Math.Abs((long)exponent) + 1) << 974)
+ denominator;
(error <= tolerance).ShouldBeTrue($"Power bound failed for {context}: ({actual.High:R}, {actual.Low:R})");
}
private static BigInteger Units(double value)
{
long bits = BitConverter.DoubleToInt64Bits(value);
int exponent = (int)((bits >> 52) & 0x7ff);
BigInteger significand = bits & 0xfffffffffffffL;
if (exponent != 0)
{
significand += BigInteger.One << 52;
significand <<= exponent - 1;
}
return bits < 0 ? -significand : significand;
}
private static void AssertBits(DoubleDouble actual, double high, double low)
{
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(BitConverter.DoubleToInt64Bits(high));
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(BitConverter.DoubleToInt64Bits(low));
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
}
}
@@ -0,0 +1,167 @@
using Shouldly;
using Xunit;
namespace Just.PreciseMath.Tests;
public class PreciseMathRealPowSpecialTests
{
[Fact]
public void ZeroAndOneExponentsPreserveTheIdentityContractsInBothOverloads()
{
DoubleDouble[] values = [DoubleDouble.Zero, new(-0.0), DoubleDouble.One,
new(double.NaN), new(double.PositiveInfinity), new(double.NegativeInfinity),
DoubleDouble.FromComponents(double.MaxValue, double.Epsilon)];
foreach (DoubleDouble value in values)
{
AssertBits(DDMath.Pow(value, 0.0), DoubleDouble.One);
AssertBits(DDMath.Pow(value, new DoubleDouble(-0.0)), DoubleDouble.One);
AssertBits(DDMath.Pow(value, 1.0), value);
AssertBits(DDMath.Pow(value, DoubleDouble.One), value);
}
}
[Fact]
public void SpecialValueMatrixMatchesBinary64RulesInBothOverloads()
{
double[] values = [double.NegativeInfinity, -2.0, -1.0, -0.0, 0.0,
0.5, 1.0, 2.0, double.PositiveInfinity, double.NaN];
double[] exponents = [double.NegativeInfinity, -3.0, -0.5, -0.0, 0.0,
0.5, 3.0, double.PositiveInfinity, double.NaN];
foreach (double value in values)
{
foreach (double exponent in exponents)
{
double expected = Math.Pow(value, exponent);
// Math.Pow is only a special-value/exact-binary oracle here.
// Irrational finite results use independent high-precision tests.
if (double.IsFinite(expected) && expected != 0.0 && Math.Abs(expected) != 1.0
&& !double.IsInteger(exponent))
{
continue;
}
DoubleDouble input = new(value);
AssertBits(DDMath.Pow(input, exponent), new DoubleDouble(expected));
AssertBits(DDMath.Pow(input, new DoubleDouble(exponent)), new DoubleDouble(expected));
}
}
}
[Fact]
public void ExponentLowDeterminesIntegralityAndParity()
{
foreach (double high in new[] { Math.ScaleB(1.0, 53), Math.ScaleB(1.0, 100), double.MaxValue })
{
foreach (double direction in new[] { -1.0, 1.0 })
{
DoubleDouble odd = DoubleDouble.FromComponents(direction * high, 1.0);
DoubleDouble even = DoubleDouble.FromComponents(direction * high, 2.0);
DoubleDouble fractional = DoubleDouble.FromComponents(direction * high, 0.5);
AssertBits(DDMath.Pow(DoubleDouble.NegativeOne, odd), DoubleDouble.NegativeOne);
AssertBits(DDMath.Pow(DoubleDouble.NegativeOne, even), DoubleDouble.One);
AssertBits(DDMath.Pow(DoubleDouble.NegativeOne, fractional), DoubleDouble.NaN);
AssertBits(DDMath.Pow(new DoubleDouble(-2.0), odd),
new DoubleDouble(direction > 0.0 ? double.NegativeInfinity : -0.0));
AssertBits(DDMath.Pow(new DoubleDouble(-0.5), odd),
new DoubleDouble(direction > 0.0 ? -0.0 : double.NegativeInfinity));
AssertBits(DDMath.Pow(new DoubleDouble(-2.0), even),
new DoubleDouble(direction > 0.0 ? double.PositiveInfinity : 0.0));
AssertBits(DDMath.Pow(new DoubleDouble(-0.0), odd),
new DoubleDouble(direction > 0.0 ? -0.0 : double.NegativeInfinity));
AssertBits(DDMath.Pow(new DoubleDouble(double.NegativeInfinity), odd),
new DoubleDouble(direction > 0.0 ? double.NegativeInfinity : -0.0));
AssertBits(DDMath.Pow(new DoubleDouble(-0.0), fractional),
new DoubleDouble(direction > 0.0 ? 0.0 : double.PositiveInfinity));
AssertBits(DDMath.Pow(new DoubleDouble(double.NegativeInfinity), fractional),
new DoubleDouble(direction > 0.0 ? double.PositiveInfinity : 0.0));
}
}
DoubleDouble belowInteger = DoubleDouble.FromComponents(3.0, -double.Epsilon);
AssertBits(DDMath.Pow(new DoubleDouble(-2.0), belowInteger), DoubleDouble.NaN);
}
[Fact]
public void InfiniteExponentsCompareTheCompleteBaseWithOne()
{
foreach (double low in new[] { -double.Epsilon, double.Epsilon })
{
foreach (double sign in new[] { -1.0, 1.0 })
{
DoubleDouble value = DoubleDouble.FromComponents(sign, sign * low);
AssertBits(DDMath.Pow(value, double.PositiveInfinity),
new DoubleDouble(low > 0.0 ? double.PositiveInfinity : 0.0));
AssertBits(DDMath.Pow(value, new DoubleDouble(double.NegativeInfinity)),
new DoubleDouble(low < 0.0 ? double.PositiveInfinity : 0.0));
}
}
}
[Fact]
public void IntegralExponentsWithinIntRangeReuseTheIntegerContract()
{
DoubleDouble[] values = [new(2.0), new(-2.0),
DoubleDouble.FromComponents(1.0, Math.ScaleB(1.0, -54)), new(double.Epsilon)];
int[] exponents = [int.MinValue, int.MaxValue, -1075, -1024, -1, 2, 3, 1024];
foreach (DoubleDouble value in values)
{
foreach (int exponent in exponents)
{
DoubleDouble expected = DDMath.Pow(value, exponent);
// Dispatch consistency, not an accuracy oracle: the integer suite
// separately checks these algorithms against independent references.
AssertBits(DDMath.Pow(value, (double)exponent), expected);
AssertBits(DDMath.Pow(value, new DoubleDouble(exponent)), expected);
}
}
}
[Fact]
public void FractionalPowersRetainTheIrrationalLowComponent()
{
// Independently rounded sqrt(2) binary64 components; also used by the
// constant-reference generator. Compare components, not high+low in double.
foreach (DoubleDouble actual in new[] { DDMath.Pow(new DoubleDouble(2.0), 0.5),
DDMath.Pow(new DoubleDouble(2.0), new DoubleDouble(0.5)) })
{
actual.High.ShouldBe(1.4142135623730951);
Math.Abs(actual.Low - -9.667293313452913e-17).ShouldBeLessThan(Math.ScaleB(1.0, -90));
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
}
}
[Theory]
[InlineData(-537.25, 1L)]
[InlineData(-537.75, 0L)]
public void FractionalPowersRespectTheSubnormalRoundingFloor(double exponent, long expectedBits)
{
// 4^-537.25 = 2^-1074.5 lies above the half-epsilon threshold;
// 4^-537.75 = 2^-1075.5 lies below it. These are well separated from ties.
foreach (DoubleDouble actual in new[] { DDMath.Pow(new DoubleDouble(4.0), exponent),
DDMath.Pow(new DoubleDouble(4.0), new DoubleDouble(exponent)) })
{
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(expectedBits);
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(0L);
}
}
[Fact]
public void FiniteOperandsWithOverflowingLogProductsReturnCanonicalRangeResults()
{
foreach (double value in new[] { double.MaxValue, double.Epsilon })
{
foreach (double exponent in new[] { double.MaxValue, -double.MaxValue })
{
bool grows = (value > 1.0) == (exponent > 0.0);
DoubleDouble expected = new(grows ? double.PositiveInfinity : 0.0);
AssertBits(DDMath.Pow(new DoubleDouble(value), exponent), expected);
AssertBits(DDMath.Pow(new DoubleDouble(value), new DoubleDouble(exponent)), expected);
}
}
}
private static void AssertBits(DoubleDouble actual, DoubleDouble expected)
{
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(BitConverter.DoubleToInt64Bits(expected.High));
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(BitConverter.DoubleToInt64Bits(expected.Low));
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
}
}
@@ -0,0 +1,145 @@
using System.Globalization;
using System.Numerics;
using Just.PreciseMath.Tests.ReferenceData;
using Shouldly;
using Xunit;
namespace Just.PreciseMath.Tests;
public class PreciseMathRealPowTests
{
public static IEnumerable<TheoryDataRow<string, double, double, double, double, bool, string>> ReferenceCases => RealPowReferenceData.Cases();
[Theory]
[MemberData(nameof(ReferenceCases))]
public void FinitePowersMeetIndependentComponentAwareReferenceBound(string label,
double high, double low, double exponentHigh, double exponentLow, bool scalar, string reference)
{
// The stdlib generator constructs exact binary64 sums at 2200 digits,
// checks Fraction equality, evaluates Decimal ln/exp at 450/650 digits,
// and requires stable 120-digit references. Scalar rows have independent
// references formed AFTER discarding exponentLow, not the DD reference.
DoubleDouble input = DoubleDouble.FromComponents(high, low);
DoubleDouble exponent = DoubleDouble.FromComponents(exponentHigh, scalar ? 0.0 : exponentLow);
(Units(input.High) + Units(input.Low)).ShouldBe(Units(high) + Units(low));
BigInteger exponentUnits = Units(exponentHigh) + Units(scalar ? 0.0 : exponentLow);
(Units(exponent.High) + Units(exponent.Low)).ShouldBe(exponentUnits);
DoubleDouble actual = scalar ? DDMath.Pow(input, exponentHigh) : DDMath.Pow(input, exponent);
string context = $"{label}, scalar={scalar}: ({high:R}, {low:R})^({exponentHigh:R}, {exponentLow:R})";
AssertReferenceBound(actual, reference, exponentUnits, context);
}
[Theory]
[InlineData(4.0, 0.5, 2.0)]
[InlineData(16.0, 0.25, 2.0)]
[InlineData(16.0, -0.25, 0.5)]
[InlineData(0.0625, -0.5, 4.0)]
public void ExactBinaryReferencesMeetTheRealPathBound(double input, double exponent, double expected)
{
// These references are exact rational identities. The general ln/exp
// implementation is approximate, so do not require universal bit equality.
string reference = expected.ToString("e17", CultureInfo.InvariantCulture);
AssertReferenceBound(DDMath.Pow(new DoubleDouble(input), exponent), reference,
Units(exponent), "scalar exact binary reference");
AssertReferenceBound(DDMath.Pow(new DoubleDouble(input), new DoubleDouble(exponent)), reference,
Units(exponent), "DD exact binary reference");
}
[Fact]
public void FiniteIntegerDispatchPreservesExistingPowerBits()
{
// Consistency is distinct from accuracy: ReferenceCases independently
// check the exponent-dependent bound for int-range dispatch too.
DoubleDouble[] inputs = [DoubleDouble.FromComponents(1.25, -Math.ScaleB(1.0, -55)),
DoubleDouble.FromComponents(-1.25, Math.ScaleB(1.0, -55)),
DoubleDouble.FromComponents(1.0, Math.ScaleB(1.0, -54)),
DoubleDouble.FromComponents(1.0, -Math.ScaleB(1.0, -54))];
foreach (DoubleDouble input in inputs)
{
foreach (int exponent in new[] { -63, -7, -1, 0, 1, 7, 63 })
{
DoubleDouble expected = DDMath.Pow(input, exponent);
AssertBits(DDMath.Pow(input, (double)exponent), expected);
AssertBits(DDMath.Pow(input, new DoubleDouble(exponent)), expected);
}
}
foreach (int exponent in new[] { int.MinValue, int.MaxValue })
{
DoubleDouble input = DoubleDouble.FromComponents(1.0, Math.ScaleB(1.0, -54));
DoubleDouble expected = DDMath.Pow(input, exponent);
AssertBits(DDMath.Pow(input, (double)exponent), expected);
AssertBits(DDMath.Pow(input, new DoubleDouble(exponent)), expected);
}
}
[Fact]
public void ExponentOnePreservesSparseFiniteComponentsExactly()
{
foreach (double high in new[] { double.MaxValue, -double.MaxValue, 1.0, -1.0 })
{
foreach (double low in new[] { double.Epsilon, -double.Epsilon })
{
DoubleDouble input = DoubleDouble.FromComponents(high, low);
AssertBits(DDMath.Pow(input, 1.0), input);
AssertBits(DDMath.Pow(input, DoubleDouble.One), input);
}
}
}
private static void AssertReferenceBound(DoubleDouble actual, string reference,
BigInteger exponentUnits, string context)
{
DoubleDouble.IsCanonical(actual).ShouldBeTrue(context);
DoubleDouble.IsFinite(actual).ShouldBeTrue(context);
string[] parts = reference.Split('e');
int point = parts[0].IndexOf('.', StringComparison.Ordinal);
int decimals = point < 0 ? 0 : parts[0].Length - point - 1;
BigInteger numerator = BigInteger.Parse(parts[0].Replace(".", "", StringComparison.Ordinal), CultureInfo.InvariantCulture);
int exponent = int.Parse(parts[1], CultureInfo.InvariantCulture) - decimals;
BigInteger denominator = BigInteger.One;
if (exponent >= 0)
{
numerator *= BigInteger.Pow(10, exponent);
}
else
{
denominator = BigInteger.Pow(10, -exponent);
}
BigInteger oneUnits = BigInteger.One << 1074;
BigInteger integralExponent = BigInteger.DivRem(exponentUnits, oneUnits, out BigInteger remainder);
BigInteger factor = 1024;
if (remainder.IsZero && integralExponent >= int.MinValue && integralExponent <= int.MaxValue)
{
factor = BigInteger.Max(factor, BigInteger.Abs(integralExponent) + 1);
}
BigInteger magnitude = BigInteger.Abs(numerator);
BigInteger actualUnits = Units(actual.High) + Units(actual.Low);
BigInteger error = BigInteger.Abs((actualUnits * denominator) - (numerator << 1074));
// max(2^-90, (|n|+1)*2^-100 for int dispatch) plus 2^-1074.
// Add the independently checked reference uncertainty of 2^-350 relative.
// All comparisons retain both result components as exact rational units.
BigInteger bound = (magnitude * factor << 1324) + (denominator << 350) + (magnitude << 1074);
((error << 350) <= bound).ShouldBeTrue(
$"Real Pow bound failed for {context}: ({actual.High:R}, {actual.Low:R}), reference={reference}");
}
private static BigInteger Units(double value)
{
long bits = BitConverter.DoubleToInt64Bits(value);
int exponent = (int)((bits >> 52) & 0x7ff);
BigInteger significand = bits & 0xfffffffffffffL;
if (exponent != 0)
{
significand += BigInteger.One << 52;
significand <<= exponent - 1;
}
return bits < 0 ? -significand : significand;
}
private static void AssertBits(DoubleDouble actual, DoubleDouble expected)
{
DoubleDouble.IsCanonical(actual).ShouldBeTrue();
BitConverter.DoubleToInt64Bits(actual.High).ShouldBe(BitConverter.DoubleToInt64Bits(expected.High));
BitConverter.DoubleToInt64Bits(actual.Low).ShouldBe(BitConverter.DoubleToInt64Bits(expected.Low));
}
}
@@ -0,0 +1,322 @@
using Xunit;
namespace Just.PreciseMath.Tests.ReferenceData;
// Generated by generate_exp.py; do not derive expected values from DD arithmetic.
internal static class ExpReferenceData
{
internal static IEnumerable<TheoryDataRow<double, double, string, bool, bool>> Cases()
{
yield return new(1.0, 0.0, "2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992e+0", false, false);
yield return new(-1.0, 0.0, "3.67879441171442321595523770161460867445811131031767834507836801697461495744899803357147274345919643746627325276843995208e-1", false, false);
yield return new(0.5, 0.0, "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700e+0", false, false);
yield return new(-0.5, 0.0, "6.06530659712633423603799534991180453441918135487186955682892158735056519413748423998647611507989456026423789794039525177e-1", false, false);
yield return new(709.5, 0.0, "1.35498631931463283087663227405360333829896691011582169465109335509820907435536323212031477389754869210069312451421528747e+308", false, false);
yield return new(709.781, 0.0, "1.79461651389914341169584204562564934475195878898205576621269604427209195324283009555290838261170839886258450955797081449e+308", false, false);
yield return new(-740.0, 0.0, "4.18873988004804893945754000158365288241312523708426071528203782534009829055723006499182778486313749674409529672371302822e-322", false, false);
yield return new(-745.131, 0.0, "2.47581622633559850463746633444960306815534331126253332296584940288488408478541535529397960585146748026850510719889061100e-324", false, false);
yield return new(710.0, 0.0, "2.23399476616171103125364445811681000656812286337946419939922579763369439173505508238045208936075928608008858947959672204e+308", true, false);
yield return new(-746.0, 0.0, "1.03828480951582823942500912127973598722423737700888896539795102195766750653959254032749036361253114174336080533600474876e-324", false, true);
yield return new(1e-30, 0.0, "1.00000000000000000000000000000100000000000000008333642060758648535093133602695199092297209593903894001794602434389798411e+0", false, false);
yield return new(-1e-30, 0.0, "9.99999999999999999999999999998999999999999999916663579392414514649068663973214681918243076038607881653792195056905596921e-1", false, false);
yield return new(5e-324, 0.0, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0", false, false);
yield return new(-5e-324, 0.0, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0", false, false);
yield return new(1.0, 5.551115123125783e-17, "2.71828182845904538625524114012277294245207378041324564716578593432480201210931242665209562398991569452359995574369903890e+0", false, false);
yield return new(1.0, -5.551115123125783e-17, "2.71828182845904508446533380258256042941501354772712009605959080847470919809942371990293379281005694591784351622350569198e+0", false, false);
yield return new(1.0, 5e-324, "2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992e+0", false, false);
yield return new(1.0, -5e-324, "2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992e+0", false, false);
yield return new(-1.0, 5.551115123125783e-17, "3.67879441171442342016935063900013207207872215777423696748060748829710301834945089279754546005072576400786058802685572738e-1", false, false);
yield return new(-1.0, -5.551115123125783e-17, "3.67879441171442301174112476422909661299800728723414457830822769996404467953203365404001987872503096657995920078280787584e-1", false, false);
yield return new(-1.0, 5e-324, "3.67879441171442321595523770161460867445811131031767834507836801697461495744899803357147274345919643746627325276843995208e-1", false, false);
yield return new(-1.0, -5e-324, "3.67879441171442321595523770161460867445811131031767834507836801697461495744899803357147274345919643746627325276843995208e-1", false, false);
yield return new(0.5, 2.7755575615628914e-17, "1.64872127070012819260985868582735805910738863689652137052707640634689532199822874124404221657875995764684980168042691392e+0", false, false);
yield return new(0.5, -2.7755575615628914e-17, "1.64872127070012810108744288980097035432882964034402679828141943074837400550675974235689715998752124911869444298749568689e+0", false, false);
yield return new(0.5, 5e-324, "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700e+0", false, false);
yield return new(0.5, -5e-324, "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700e+0", false, false);
yield return new(-0.5, 2.7755575615628914e-17, "6.06530659712633440438407123842467173161435034850712385322840380446487317193083390290388871060777615994408967788698907406e-1", false, false);
yield return new(-0.5, -2.7755575615628914e-17, "6.06530659712633406769191946139894200976625127925886738931181426507552124349461485653266736650654364662534288843797347728e-1", false, false);
yield return new(-0.5, 5e-324, "6.06530659712633423603799534991180453441918135487186955682892158735056519413748423998647611507989456026423789794039525177e-1", false, false);
yield return new(-0.5, -5e-324, "6.06530659712633423603799534991180453441918135487186955682892158735056519413748423998647611507989456026423789794039525177e-1", false, false);
yield return new(709.5, 2.842170943040401e-14, "1.35498631931467134190408200771649138462814745946346085228520997616815466357346054295179094605658596213443711502371221154e+308", false, false);
yield return new(709.5, -2.842170943040401e-14, "1.35498631931459431984918254148526452401241364519490588265804807914037406021512226306996081725228509824420020241490025908e+308", false, false);
yield return new(709.5, 5e-324, "1.35498631931463283087663227405360333829896691011582169465109335509820907435536323212031477389754869210069312451421528747e+308", false, false);
yield return new(709.5, -5e-324, "1.35498631931463283087663227405360333829896691011582169465109335509820907435536323212031477389754869210069312451421528747e+308", false, false);
yield return new(-740.0, 2.842170943040401e-14, "4.18873988004816799060529027425892129967656808821669426559207129322040380331320256326493371975675068776828279990622140512e-322", false, false);
yield return new(-740.0, -2.842170943040401e-14, "4.18873988004792988830978973229202159386398003014182202852475871980793701921710704453367931047247146474898828315139720120e-322", false, false);
yield return new(-740.0, 5e-324, "4.18873988004804893945754000158365288241312523708426071528203782534009829055723006499182778486313749674409529672371302822e-322", false, false);
yield return new(-740.0, -5e-324, "4.18873988004804893945754000158365288241312523708426071528203782534009829055723006499182778486313749674409529672371302822e-322", false, false);
yield return new(250.93027242348228, -7.105427357601002e-15, "9.49801073273094253157481371408931196262015372046111024520792916863933250249044475327100520607949177296345555934420080915e+108", false, false);
yield return new(577.4297734475065, 0.0, "5.95064846298715475017756264820905383780483412690520919873199396378905872032452347602613185026484078076086846838293091926e+250", false, false);
yield return new(458.2952005578029, -1.4210854715202004e-14, "1.08411832394119972239921061486244187075377229612411403992876780928530111493985756351656478925470029690906962689829123516e+199", false, false);
yield return new(232.91365540915126, -7.105427357601002e-15, "1.42270646202855570795105066551029220514192746329542848939099080733314810138540206880245762216511989076262846976739482728e+101", false, false);
yield return new(-735.4304900229989, -2.842170943040401e-14, "4.04200046933377254144819051475088531086179811785677460017967868108769825382211663058605775395630688019176543633067812670e-320", false, false);
yield return new(50.56373826606193, 0.0, "9.11071609158933230364758224983522968772682253770782165081286583763227727306953915204305513774800464316912364057806790954e+21", false, false);
yield return new(522.4487218172492, 2.842170943040401e-14, "7.88128373074868083431112596166194679520453779963781680479541553911174837615414882157699129662463166210253343504553326324e+226", false, false);
yield return new(-189.5880156981899, -7.105427357601002e-15, "4.60225785131331476526517813915952558382558378761438702748917591064571800768752725835864375188061134212888868276662089748e-83", false, false);
yield return new(140.6877547787642, 0.0, "1.25868069648830247523213398488867628656926023414823905511051025482853508308742369674827927481363766083492275267356210277e+61", false, false);
yield return new(-318.34225359810074, 0.0, "5.56821384336619435843415567072792478926763686156755669240141902340831269029547744050776980794225342290070487522706997819e-139", false, false);
yield return new(442.07747449085923, -1.4210854715202004e-14, "9.81313435827975693632807914333694349050412402766013082130152192539291085552367625216145233697637552378052256407857319955e+191", false, false);
yield return new(-107.28452055986338, 0.0, "2.55225890172698534850739352732399424691054744397690884653911444103577671130444903848573638258330478092137181679246904127e-47", false, false);
yield return new(-256.97010496279836, 0.0, "2.50784909758828257273036511705620036377811754428595101417495497082368898096714234841549295180919149910206822560677804858e-112", false, false);
yield return new(-452.2010677438447, 1.4210854715202004e-14, "4.08857122786067834516112203571011869818698386224280144528203029356272713743196702575507308958781375570088716619243044001e-197", false, false);
yield return new(-701.8896864429325, 2.842170943040401e-14, "1.48998629250118854746025803371269449079893235179949877998209561409366173805652818750854058253432753461572494293418512132e-305", false, false);
yield return new(68.1551994735205, 0.0, "3.97582302382462639011400068806121804519111450847307815175296996109360953086849803712696556189043125094144420142524023922e+29", false, false);
yield return new(91.54881422272967, -3.552713678800501e-15, "5.74307967939262805086601974514728712736787714967131056616365518940313884450085446051420831049002941170922139324538374797e+39", false, false);
yield return new(-387.3648267681524, 1.4210854715202004e-14, "5.88292418014349059103522763353097715470350636435810374589657072652064955867431399520954800231615885687179560995393738407e-169", false, false);
yield return new(-338.8759738773683, 0.0, "6.73030112102762255518139567713182495886647664569931035612501887256849737786196888847647086282155650968939706552669890048e-148", false, false);
yield return new(141.43353196414284, -7.105427357601002e-15, "2.65339855391164529690413419054606699721399186218051284634839822466668390080716152972191549530794656627031114989912639202e+61", false, false);
yield return new(-684.4232888726077, 0.0, "5.73775970940444987344900786372125267612866863215324146110077944615505565856096824655942782879964830700880328834285135174e-298", false, false);
yield return new(-403.29413329096866, 1.4210854715202004e-14, "7.10531486103231642751454913407146989721982128524585147092389954538952015046293811397779051504494156750652848509236821739e-176", false, false);
yield return new(-190.59421028189047, -7.105427357601002e-15, "1.68262056230653327076210534642289568386677497392577983983871687461848099340543547097695277857592119757535221800370292198e-83", false, false);
yield return new(91.83779249104316, 0.0, "7.66737154951184450517075529908193007956936911126519583423305095993670248476520646253552309969262019434115187753451214558e+39", false, false);
yield return new(280.24724241767626, 1.4210854715202004e-14, "5.12661791223369236901075902303662203185903197848721230640435340586333535925762699243564675381745895121874856791628349657e+121", false, false);
yield return new(321.96114276837716, 0.0, "6.69803930285937304079619093791761852581949923084463550869313261348501378366548313185611283895928677958389213408495529413e+139", false, false);
yield return new(-4.096935467664821, 0.0, "1.66235408009326974158777166931861569578487927235171142521144248227161212521040337653009184219533116528271957451693434158e-2", false, false);
yield return new(257.56036412854303, 0.0, "7.19523359568790986972665886679769218393221522125510591481122372735732459219218436049689698048678127300889164120719994546e+111", false, false);
yield return new(-637.3010086151655, -2.842170943040401e-14, "1.67374251193015027071667484663897412483811885333358015014506520684888477542082776408256850185443159831941867306755376620e-277", false, false);
yield return new(615.2054868862347, -2.842170943040401e-14, "1.51477521773985721276500043312913218359520599872195288109718090413284480980057544783713172090853295752363335142761482390e+267", false, false);
yield return new(80.13746410198178, -3.552713678800501e-15, "6.35709136492234151218757348140475471662109405415338642155588645459782521263055575469817648291778787760100772038035030887e+34", false, false);
yield return new(-630.4900992610425, 0.0, "1.51924912991470819482158207854064915985178215326177168820861229021166163355260917174419334474695254506614283873671810920e-274", false, false);
yield return new(-321.5785571936883, 0.0, "2.18880520285380314446097410847931586894762055959067363912272530169806778819043658742788926931005796368593306162790109910e-140", false, false);
yield return new(6.41553078882248, -2.220446049250313e-16, "6.11265127422600571454393805620312795007553865177852072726337729126911900788202237692414298628763802557668293685780017830e+2", false, false);
yield return new(-204.84070954048343, -7.105427357601002e-15, "1.09347832141549036992145307451829337714672938988298856373695730350074700475619235974772171773601299398182793720704282516e-89", false, false);
yield return new(-345.70650349152163, 0.0, "7.27064894213756094143051307246460218923073153708943526058514802272186838884611846089338600157167015858075406324471828126e-151", false, false);
yield return new(-44.69038437940867, -1.7763568394002505e-15, "3.90132984328998639153640444443441004504539448372434193772292586216432790929396164787446831018226116337379816087140196540e-20", false, false);
yield return new(-35.45802498884893, 1.7763568394002505e-15, "3.98818603240024412677056837818009836606880013889210921585791770390087666264983980319306779175315256637118966718128616494e-16", false, false);
yield return new(-599.9699079319961, 0.0, "2.73136460452927918564251752268482846483013499067506868490484878055717083600532399057048743011425654026249773214188639030e-261", false, false);
yield return new(51.27389503570987, -1.7763568394002505e-15, "1.85340222347047045307283124431395697551511670493878943230923690543670071485871021225146167715309537643474082321727108228e+22", false, false);
yield return new(179.81121150501247, 7.105427357601002e-15, "1.23315293513823756475669668242394854477812811138489595050533711476465705049279044531231574641254936256659024689363595309e+78", false, false);
yield return new(671.2324965176397, 2.842170943040401e-14, "3.25513730111286634411163583093612734148702195057714321776992836482496773348027259840898047725974999619011018090011732496e+291", false, false);
yield return new(603.4872037383655, -2.842170943040401e-14, "1.23356626162291426575711439136138225722050571483580215755723519039587109956512911055102667002705027239702730649636024148e+262", false, false);
yield return new(-571.8239156747627, 2.842170943040401e-14, "4.57118504424808643780025903362127907357552371872793263464492178766843330641613262736497779915464994063447385212281939640e-249", false, false);
yield return new(705.7571777492733, 2.842170943040401e-14, "3.20957745042415935190120728695943678517957716905260704316557939088800013020171373168944847179063408287378493281483923695e+306", false, false);
yield return new(-538.4460383699854, 0.0, "1.43171552148329282858644050264938696082967869026053524217192148873043652710121140393694096285570030806662590496463405379e-234", false, false);
yield return new(134.25595411594395, 0.0, "2.02590947317619573817196200296605806871129412380406793177960964083186204209186245082778449177578504708821127283281088013e+58", false, false);
yield return new(102.8951820079003, 3.552713678800501e-15, "4.86194185213250590505429502918370038856773180690098191998626688647359113205161862412771253991603744385029025176181652331e+44", false, false);
yield return new(665.096539284573, 0.0, "7.04298793200326972137975717766101950504527167303335889307457324120239112016796926955384067324807256986116186642965822103e+288", false, false);
yield return new(-679.1618324086656, -2.842170943040401e-14, "1.10602225457818822480676504660822855971064560785584048186458310827836020981205648136901111813347567173750742819238680689e-295", false, false);
yield return new(-91.53952569584328, -3.552713678800501e-15, "1.75747483140209116750730490767133914877458649064452450294359531176423217255893741743861655636302211180223104887262003059e-40", false, false);
yield return new(426.6976037731288, -1.4210854715202004e-14, "2.05312201586602221058753331569536937926729784760859393531500824865228589528205230162750436019123700121864663142302434385e+185", false, false);
yield return new(709.4702332816566, 2.842170943040401e-14, "1.31524720886072690261452395187476248627966788261101638825708717446304810790454153475370361387705015075097660896901346177e+308", false, false);
yield return new(-364.74968542191317, -1.4210854715202004e-14, "3.90143472675543495413935655535884051655069764259416524281553157419339430928088910933430247160446330234717589349541615174e-159", false, false);
yield return new(134.38041108098366, 0.0, "2.29440990243574914760263002568767163292551468360567060285997194547352132932679243464091277734766495116351048086713513546e+58", false, false);
yield return new(-592.4562292563733, 0.0, "5.00643825984622129922843051122143992989107241800393121571121659323415909386134167219202906585784283201024598774920756688e-258", false, false);
yield return new(-255.3660084727988, -7.105427357601002e-15, "1.24724466400308792716284180988680891934717369233432388621957248280265732404070448393917181529411500164079403693168891641e-111", false, false);
yield return new(494.66508969778897, 1.4210854715202004e-14, "6.76579517398434522352083743516969628862468901182630122647537553007629761041574731083599693697657123252100615657162550488e+214", false, false);
yield return new(509.71598545970824, -1.4210854715202004e-14, "2.32723276680004458718504154657507830053163550484781360951256445626646837449920799022749530833800792155843032397731641787e+221", false, false);
yield return new(-244.83320900932324, 7.105427357601002e-15, "4.68045787199196071915953819923942534727546149432924557854137016641747263091478052958456327919722669595411763382197390014e-107", false, false);
yield return new(-406.27613645957393, 1.4210854715202004e-14, "3.60176859196712875505528192669884122795740666520055077842557157256378956116975889324120687785422492015133796923823036959e-177", false, false);
yield return new(-368.176174394512, 1.4210854715202004e-14, "1.26799952896384662609803923789752636957714621779651397092369773221540729118703350094573754795815622161138061330040847538e-160", false, false);
yield return new(39.34122805266588, 1.7763568394002505e-15, "1.21808684951616917694911821736082484334343443238912181500560792972144526806404478169973915295419799007994463672469838628e+17", false, false);
yield return new(-175.65411926931256, 0.0, "5.18066222740719887303934006355350922638709735358444375944222596993817007028801791071375595108973783731157641595324573551e-77", false, false);
yield return new(118.54449090906303, 3.552713678800501e-15, "3.04241365655737483436964976934796713108425435632199230829088096567792098757965717776038162071232577851279203867291853550e+51", false, false);
yield return new(-356.7106303160003, 1.4210854715202004e-14, "1.20932106409461028101229574473594961219000871487990131981219040633983265390303679813939772316519981999677183894696570974e-155", false, false);
yield return new(-197.87493664020667, 7.105427357601002e-15, "1.15879579399031235224731433345346415716402694390929287049206136625288410360687722648389779965259746098144823545069241055e-86", false, false);
yield return new(247.18965323159318, 0.0, "2.25477069682091460817422441514136350069046268187801527508476164879628438689578944795308449934304635389637543817063836575e+107", false, false);
yield return new(-448.22392076826463, 1.4210854715202004e-14, "2.18184830862555256076184957541592066433264585149084935203370473545033144493776397546205698592682129055160963478307073657e-195", false, false);
yield return new(-545.4262410175483, 2.842170943040401e-14, "1.33165965078663374227421884459851912715717236887584242565094077153936788608837393671057990995735735780289763321155662924e-237", false, false);
yield return new(392.5027808695638, 1.4210854715202004e-14, "2.89595536155235606779328586206281138037821919888253802766164529907133035475917082772684733168091068740777501428488150291e+170", false, false);
yield return new(-222.32679449972443, -7.105427357601002e-15, "2.78419705355415804805773974422854425652620458571591666593221242859459519935347523505402366927333897507762698073222166682e-97", false, false);
yield return new(-531.5540173625856, 0.0, "1.40936481776761068233443836418568684450497320371274372192863587761766092036044721756179029181907611209831308430028578024e-231", false, false);
yield return new(-85.733957872666, 3.552713678800501e-15, "5.83734261210479248822643598283974350238854471208889616284907789921193764953210616377906438727257834879091564367062876257e-38", false, false);
yield return new(32.6607348895825, 0.0, "1.52889245502161417553454731885209253160637659373638769704634738212086079510670481544724428523483063332140385473708018998e+14", false, false);
yield return new(-224.5088123994651, -7.105427357601002e-15, "3.14095443508370913393940109123471407020598833143667823153680552903170939770620198754801466178124507333003906302487026964e-98", false, false);
yield return new(135.17140664692067, -7.105427357601002e-15, "5.06053016380334455439438367702280222471737798236873734595245756512166214676683521797786197800644723431892866653639675001e+58", false, false);
yield return new(-230.6859481714123, 7.105427357601002e-15, "6.52177267064639549468047810958252171625307118458257288857288818771185600548392950487117222631466323433666334054645514609e-101", false, false);
yield return new(-645.5414507291703, 0.0, "4.41479059313068759562576737023912794753810431487745135742716629178692175415181753687537061990295066190243878992535371412e-281", false, false);
yield return new(554.4109436393214, 0.0, "5.99257570627191980090965859153084871994986434607324535724829919855354319622507815179701959156380169804837252008933540419e+240", false, false);
yield return new(108.71917436232104, -3.552713678800501e-15, "1.64489243266304185983532152078656598357928805648630147718479630040447189220599482157747792207564376993748531958706185317e+47", false, false);
yield return new(-237.09044151142854, 0.0, "1.07877168691464399626876785041120029647909931088156693163439283196483131826505453476721647712525777216542624330494024608e-103", false, false);
yield return new(430.79741739598967, -1.4210854715202004e-14, "1.23862885548169936394194347087057354337043382538897984887982966300135192383462802873661410405059897101518554243786737564e+187", false, false);
yield return new(633.6777790557021, 0.0, "1.59500757005182245606746146509717040779737494576422667935568231010684912237249261052157254275214359767326768267732612858e+275", false, false);
yield return new(-416.6519715701372, 0.0, "1.12291755913646994734496507225303333169683646752427346635651933607143648575854786106580536054257289836454059194822758571e-181", false, false);
yield return new(-655.8905217158901, -2.842170943040401e-14, "1.41372743526635734435351403881348415439105196882923844463768868271716033928476781635092637960284716353384560438411199200e-285", false, false);
yield return new(384.800981659502, 0.0, "1.30901000416051761553318718702173751623500269400679241722508171318254958885009240032159795354769002801268769541386450640e+167", false, false);
yield return new(249.09545000448884, 0.0, "1.51627999150294289465865077063737784311859827358833815622711081424278027131363375280934340903769499612585134870639145990e+108", false, false);
yield return new(118.35856735044672, -3.552713678800501e-15, "2.52622882509836053036842667106386843587108197791382469116866488367039198845904594632289230816871236262805184312384518259e+51", false, false);
yield return new(-233.02943249989255, 7.105427357601002e-15, "6.26041818439684902756156918409976347778568086341134061530725618179675426078038062798078541426128868064560359708014777356e-102", false, false);
yield return new(-325.6573998261637, 0.0, "3.70500044549927178166061628511151133661310445672545087160397576150422558737659370386677569898465709070572654776063910176e-142", false, false);
yield return new(375.52452413281935, 0.0, "1.22526111304631493769301328032140094163150783291496868484958224376777296781674999783063227587525535702917508632826634661e+163", false, false);
yield return new(-660.3677143815154, -2.842170943040401e-14, "1.60674004220807970340028241908152775128463311946857277175369025422233543903917619716787262579511416031819721594493180449e-287", false, false);
yield return new(20.31432117178963, 0.0, "6.64350993063175430562472255795589450796285618025672429108091323231835423092164205207172380744328026607211503189364004682e+8", false, false);
yield return new(601.3846699291009, 0.0, "1.50675850453384631050243370464746351530202406785604477525188377747514309853588706562454882966204743689811471372503486798e+261", false, false);
yield return new(310.81437767785565, -1.4210854715202004e-14, "9.65982195266579522084189784285064714055653790640343003233212178038114497854800733071971205221230490480717066008912305631e+134", false, false);
yield return new(-161.12394644606957, 0.0, "1.05866646424628572695450768665946393833118930403130486132205869393946498338813798879617533513944893460004248101848283145e-70", false, false);
yield return new(158.15269361060325, 0.0, "4.83996402092701254381473675819216385162614102231691503651191543337642034851066940719399275711594061045797069527200814090e+68", false, false);
yield return new(240.38152179358872, 0.0, "2.49096982402923380679076214665141330751904612854125448533355962410712139298471618731197950270336252525625172008705933749e+104", false, false);
yield return new(76.6258707831455, 0.0, "1.89754835660927967642577500743481945247552930621153142507203936779148657897574592396218433601340107764875529869995787290e+33", false, false);
yield return new(451.2591166347113, 0.0, "9.53551740049111486453356904503534415634172703277865158923437506182942087294323765208741663521369052517685424972586067593e+195", false, false);
yield return new(-171.94416358114267, -7.105427357601002e-15, "2.11640393939211768065359527131234963661473196443547421563297987733536823073910807659834937145642067180617496920497327031e-75", false, false);
yield return new(-166.62696912201864, -7.105427357601002e-15, "4.31346992212197148473463273482031972565389554928115558452647785718319818367431933817709256859683802664610280151763785638e-73", false, false);
yield return new(438.8058432573266, 0.0, "3.72354282902078986440827057654015254202897068648594730364518994115935592951764923140617646370552001017794039018681878704e+190", false, false);
yield return new(708.6122155749354, 2.842170943040401e-14, "5.57667112483837823632590096773037035752460219172350309162630535169688741070671065714195293022110587824111539240041895801e+307", false, false);
yield return new(-258.10286637137364, 1.4210854715202004e-14, "8.07884677882273596165864569905032008833297223064459495799681617785936292386502237910251871005011029999759872026824388954e-113", false, false);
yield return new(-668.5773742262463, 2.842170943040401e-14, "4.37054552328902344960229802973080558419636046877465077527546421331153430261288347483472011320642493600858865139336787251e-291", false, false);
yield return new(68.72133476955821, 3.552713678800501e-15, "7.00319919656770533050064402047626953073246962461362352376270511612285027690520370519715526898773686041137693392463547683e+29", false, false);
yield return new(-341.3859640308291, 0.0, "5.46965107353790249225546109655744454092945976290799275590455664320782583684107163650236671692623058745196748433162529167e-149", false, false);
yield return new(556.5169290757906, 0.0, "4.92301754289320501332799068218323952543252499685217338909634332133336831028417490987730398815917926439264677775366490561e+241", false, false);
yield return new(-257.711610143337, -1.4210854715202004e-14, "1.19473006399432048670404452904178787009837760940243112076488096845274250660760115586974051058457713056243151713342821265e-112", false, false);
yield return new(-203.96567767848774, 7.105427357601002e-15, "2.62320170884231716280796633780583578643314516879574242074578595168107907901745258742752228799721854416075138308118769033e-89", false, false);
yield return new(476.6229994804148, 0.0, "9.87958319018279459520645857360931287505270661146929368384184547831896729007562917668662658747893220479007957623259111139e+206", false, false);
yield return new(-176.27049928643976, 0.0, "2.79701527133146706930307694836642049761414509437974115793733135841013131547146082509729951115263679226005975701867174878e-77", false, false);
yield return new(-703.1495066204652, 2.842170943040401e-14, "4.22716618408630623343343806990944364865776305748321363733903163310254862031016091920100756497961579528243414826527633188e-306", false, false);
yield return new(677.5891641388175, -2.842170943040401e-14, "1.87600928244100606895556254329747811341066689737485203621551712501905396017106836105056293976015667441225910644112421120e+294", false, false);
yield return new(-619.945567194333, 0.0, "5.76847596083098818682608157177757517402638282321543532862870221609009779614622493188479057696459144187037418525708479322e-270", false, false);
yield return new(202.69642108491053, -7.105427357601002e-15, "1.07136431972755133353912064756923875029609486074127323613696086569829243746812927458492058941282307472625653880070160417e+88", false, false);
yield return new(-660.5748247663681, 2.842170943040401e-14, "1.30616703772299420405313171503739729108596331424792323053513987373620325759631181831420928654832364267869235613826272719e-287", false, false);
yield return new(-208.95150307870438, -7.105427357601002e-15, "1.79273140923089434929854991230632125293889458260899249842302512324248746792542241300588965049987262573793118715032168611e-91", false, false);
yield return new(-540.9486483605461, 0.0, "1.17216034279388029986759971498479606840748087449025029107565637206527761662869136772325883251932649066151041991101520894e-235", false, false);
yield return new(-335.04635451866346, 0.0, "3.09896770753953357378279842134714187850362916220723692830117803965597277878521652926132015176312289119882160813836470804e-146", false, false);
yield return new(170.48363555537776, 0.0, "1.09673619502504405890510127230031871586340626516360177423901292239241384221518118362703342429904852957136432596703717244e+74", false, false);
yield return new(552.584882970878, -2.842170943040401e-14, "9.65084759624036682040318489424619029427518636225098472430849421338326872161496251734022198398615722512608239904136009272e+239", false, false);
yield return new(-733.3082358136195, -2.842170943040401e-14, "3.37504565446218296220925247126913872824750530647259433618177708427071776701606838824858391487169853948845141086867520523e-319", false, false);
yield return new(-671.1400620166272, 2.842170943040401e-14, "3.36956999275600794096589468271915376660431189531456353431179909915551433723669423059652642060485598614491599468318322290e-292", false, false);
yield return new(-688.4910237993057, -2.842170943040401e-14, "9.82081486344526289244134661506325910668887414958851926713762993629126042599601549835549983794701145901938104975285870675e-300", false, false);
yield return new(205.09735553202813, -7.105427357601002e-15, "1.18208786909655175841883874204612003609552703021958399792954891780138999015448891035633278690379009153411434056341094025e+89", false, false);
yield return new(-58.23072934458048, 0.0, "5.13707100297237098104266233064652428179049613609733560789422493226301830651477399337728619629114716614201518941296717974e-26", false, false);
yield return new(-741.7129601589065, -2.842170943040401e-14, "7.55360458775827838369615895555725261182824179032463157097066330442274932235274985720897646153530498694988397849947432465e-323", false, false);
yield return new(-62.58204284209387, 0.0, "6.62161807136668674896797079976433230873048819907154614106400583717110259236889910702590314055841976721229970204393755589e-28", false, false);
yield return new(-625.7181292372568, 0.0, "1.79501980826348646302915113188243698845357391665766159477205212524237997367116111018331327384003813696949364215197082881e-272", false, false);
yield return new(-56.82793910938426, 1.7763568394002505e-15, "2.08900570902013877475405972005196979160565878605399624034910836701291440204389159813680459259262629751086297080301139653e-25", false, false);
yield return new(-328.84734523176047, 1.4210854715202004e-14, "1.52550128327171675322617456706468935720395331417059524381587230279088460031464795181701355469007250432205341055277744364e-143", false, false);
yield return new(113.19740033937967, 0.0, "1.44879298070323079557901457821641607607897364956460004574905327389271913393460123666730520117031551672323366901889385067e+49", false, false);
yield return new(-84.87758596620938, 0.0, "1.37446212747612557168364797560294183533109492249935375082439303824216161427156528200477010142073277887683259392870088733e-37", false, false);
yield return new(123.4940152204855, -3.552713678800501e-15, "4.29308372530069170973892214731406282521878000213917588033198141592895743667225546422773375605426118764143473164724034257e+53", false, false);
yield return new(24.346466429791462, 0.0, "3.74572616178532115066560661634825187933658486076041971652280867756714227688105631146085171626745812033705621911753198350e+10", false, false);
yield return new(459.4426256932252, 1.4210854715202004e-14, "3.41505018170149899303511576143081135244064834431861529038444296553082760709417383326769062028259428966556407741344252767e+199", false, false);
yield return new(-712.9993956574617, 0.0, "2.22995893541962643602062872651506489635742636732009253063164293769101004257543863924773287363101328716910109824242615661e-310", false, false);
yield return new(-625.6665513685375, -2.842170943040401e-14, "1.89003231317404761977855218215807947928178567787536638768629574161124550136021118539567242060823890806648695532352403823e-272", false, false);
yield return new(56.866187461157665, 1.7763568394002505e-15, "4.97360649218148722044148037502113462916748181914413657419335419084869036083124583897968713031848437414965512314736391693e+24", false, false);
yield return new(-467.06617963941056, -1.4210854715202004e-14, "1.43131591066636393759436799614276464593850324418650992703834780889190425559069152476049812700735685255299338107602339123e-203", false, false);
yield return new(94.81841833841338, -3.552713678800501e-15, "1.51048308825408042393708016517089571544301615512607532229653490141839522712078261371461011453273061610761166967177713010e+41", false, false);
yield return new(182.76566148117058, -7.105427357601002e-15, "2.36656404847775716442943066019959483156790704649103843820460677253532939240359709624311997232416759688407755080938383798e+79", false, false);
yield return new(-306.5077786036067, 1.4210854715202004e-14, "7.68003310421864022516598684068539927578764958244714079566607806622394018089150358194592176107286627700657212772317525644e-134", false, false);
yield return new(258.4912636464634, 1.4210854715202004e-14, "1.82527969190489686298879041020685242587371912869767691008073640008460953362020911773203801327683077002938909778909883982e+112", false, false);
yield return new(-358.01575939634876, -1.4210854715202004e-14, "3.27892331446416498316378810134135956681683518401072863323546682841100325126051690155660190774670464927013972112909475502e-156", false, false);
yield return new(217.52688202284958, 7.105427357601002e-15, "2.95613680188923321007480140974518989230714752281572352124853331941499059973687472474725322198364725824179066342003470329e+94", false, false);
yield return new(305.4725873994116, 1.4210854715202004e-14, "4.62443926769781025580807298435065682595739231836739247475315390100086371623773560876114664949282193725283784145428864029e+132", false, false);
yield return new(-91.84720162404324, -3.552713678800501e-15, "1.29201381201659221204375393513947266013191953705082708325272035501328077968586495439019181916200934849115497234895712817e-40", false, false);
yield return new(-655.7052293351836, 0.0, "1.70152033842428019258745020120026236210010934225668984731743559549195214088639441467815062470859894630602255396237377307e-285", false, false);
yield return new(-441.32512250749926, 1.4210854715202004e-14, "2.16239271570281451981909158963745816114305775850534143232570032235864596989637855926141364981653372047622477888978985467e-192", false, false);
yield return new(546.3725885723843, 2.842170943040401e-14, "1.93464052261247081730374368780752277879526224578402951237394795662672805332844088074483955808365599990892831643256253873e+237", false, false);
yield return new(-326.4858325924474, 1.4210854715202004e-14, "1.61809674969901988971025676513646602782188089062731951719154407522711666673261485688762755775271152115334845923899725133e-142", false, false);
yield return new(158.8878656503664, 0.0, "1.00953944698973826667081747653693668484073166211027862110979892662724308541248549045349948556435592385764020979309428396e+69", false, false);
yield return new(-400.1667792224718, 1.4210854715202004e-14, "1.62097360342723023611227523555764736633399616567486474049947501191129778487954822609091850724767407853064830753356794399e-174", false, false);
yield return new(6.242921409398718, 0.0, "5.14358971279218287337848768799695990608233709145457936663718355659246445650971899528724888742832323611333713784548894678e+2", false, false);
yield return new(519.1711689059819, 0.0, "2.97285562958806854372682579821196216641220134989583392315995614005927068073125530418734944476905853930193522233374556266e+225", false, false);
yield return new(-324.0785277676566, 1.4210854715202004e-14, "1.79673359060408625993399783580787813775885775878332821412431171337915431002003584628127912309169264898041939380041394836e-141", false, false);
yield return new(-654.2943313671838, -2.842170943040401e-14, "6.97561249056284812762495645428242024901361126922484018653818556611626063390207481086647849467538636672711906911815891909e-285", false, false);
yield return new(306.1977778104076, -1.4210854715202004e-14, "9.55004183578553294896574785274104960330779898771789748311387807122125765059391111934187414075754236806379044104325360918e+132", false, false);
yield return new(557.4719608490257, 0.0, "1.27937073589269455944708930014615412378806747431963436932349003579479118125039478963045577777742248774177711243936500827e+242", false, false);
yield return new(-257.57779471152276, 0.0, "1.36579367126009449589496245396423700442510671332735828572246509146147382742171163042895469506190061326752965298856898642e-112", false, false);
yield return new(-599.2631120767353, 2.842170943040401e-14, "5.53779936168350827116575089278555183946498793795792488663064018076209551784106929113489272842975481571694012477805041496e-261", false, false);
yield return new(0.49136323434026963, -1.3877787807814457e-17, "1.63454296692471874922969302018717475210143065618621554866287399119926825793536824290996017321585888363041839623154675305e+0", false, false);
yield return new(-144.31395096992287, 0.0, "2.11469350838046543971863740968017524164039931035841005261426037141338465647939157485568111038607662233080350025777659705e-63", false, false);
yield return new(110.04148246081581, 3.552713678800501e-15, "6.17175408523003161644870949504713437286053840808263026835884987020874703429134526635548498615889620111929433910098739619e+47", false, false);
yield return new(106.06851508223326, 3.552713678800501e-15, "1.16137053629607991976619722231813270463584642648694772741286231711794480703855632429170516691794512993013974339420039017e+46", false, false);
yield return new(-345.23180350092304, 1.4210854715202004e-14, "1.16877997480496343262807628349628474703231978230616022555623032785157554161392909631451837033754721849108200718459420694e-150", false, false);
yield return new(-638.4361622071322, 0.0, "5.37895246018549769090960535077083550473311866303112177892620503384481126457048442393772870159777516546967431838569423398e-278", false, false);
yield return new(361.4433597083125, -1.4210854715202004e-14, "9.39413164502447626847328764009177183297408781592951513281931633463913673493675341251142028657603620407825016689176192087e+156", false, false);
yield return new(45.295722882428436, 0.0, "4.69550710091158506004323950004901577226281624771862529313617517050793089457445098524844327428673055680449203987605691549e+19", false, false);
yield return new(340.5160049900571, 0.0, "7.65988001607782515861684940977406269165269044648423742217291849129270546299711308380591886370867367449879588882284124571e+147", false, false);
yield return new(283.43041449589055, -1.4210854715202004e-14, "1.23670187466181937579504997201852081630303356603871150322868283606152791065491529848691798675729743029649436313311123110e+123", false, false);
yield return new(-533.5005145553998, 0.0, "2.01219671678236981238523705935452018818908825957461457058521813394237307700688820316331668993649881313826122916412489188e-232", false, false);
yield return new(257.5404833898684, 0.0, "7.05359959610153803520371341431718520217933805066046854728474794744255109453153995542586820309072078224867169077457848841e+111", false, false);
yield return new(-55.97131132508878, 0.0, "4.92003674888733188462777919013806765776660861288478784590109001507531417219251531651181709841825584795760099719250935282e-25", false, false);
yield return new(663.8146166565214, 0.0, "1.95445205276546415830848264720220612970874891531215398294603983188898656661020098574053723484280660359259632232395749088e+288", false, false);
yield return new(-619.978350187033, 2.842170943040401e-14, "5.58243421970874331521084612242662925784125201719365507202636149585552827542807237439630614045891216256004988491512827887e-270", false, false);
yield return new(427.96980959954817, 1.4210854715202004e-14, "7.32700908894329738815921903329975424650236936473446380061010067401625753117828994987116791017873746052357916326772381762e+185", false, false);
yield return new(-709.3166236040505, 0.0, "8.86552474891739902009931994868270540803096308137043035787910108049247915603077181158929594767371003126588295782081427790e-309", false, false);
yield return new(-180.40321004228326, 0.0, "4.48622820031742173751457015278277542837120776996069052656617251663110655389425073468769980385458705803739157336193527461e-79", false, false);
yield return new(-56.03689178765785, 1.7763568394002505e-15, "4.60773096424309580180923100483306173403108157182832884534078747775819542629277403115814827021799635096367670788215522118e-25", false, false);
yield return new(-207.0966884734462, 0.0, "1.14564740452679797406722882531458749597958934629409550865352776344298021536729694907006539648995177762055386196784024387e-90", false, false);
yield return new(-260.51328761009165, 1.4210854715202004e-14, "7.25298415111199935044310928873911885258150934851603347756014302156314740794690613701570605444734384401935928317087814485e-114", false, false);
yield return new(-185.59022255498292, 7.105427357601002e-15, "2.50720848667368445904068897974087540160232837956095638451919183110596200631470050701397086877272779566623463819202590095e-81", false, false);
yield return new(449.31972781926675, 0.0, "1.37112927062017605757281576312740617526880508934741023026258352573791155128931809085560544781349069292659004139695043019e+195", false, false);
yield return new(280.61708082988207, -1.4210854715202004e-14, "7.42078300285110437930626699237726468020952574742841831075563702792387518027073970369853487902262454295683085307520937589e+121", false, false);
yield return new(-599.423232627025, 2.842170943040401e-14, "4.71843248791009713712341330971983311960871068978438433777453568265781998265440519101362745406137031673928623224998909552e-261", false, false);
yield return new(-422.28534960302767, 1.4210854715202004e-14, "4.01608484085323914105359962595620812076905405352870982102470448228463792481070784199420192412584577532191202264884281174e-184", false, false);
yield return new(208.7139918376423, 0.0, "4.39880744155987796149679220324035397183897101999165585835589836467720793839581045908833764631058714911143276869781712912e+90", false, false);
yield return new(651.4323337183437, 0.0, "8.19346998741724398862034981710191986652668012120985395960358001838927439951191429923009327416530979187330369313087058161e+282", false, false);
yield return new(422.83806839504473, 1.4210854715202004e-14, "4.32752756222156261225102028173066950435219885668508894983208193647039881585514069326792965072898699558786013100345984387e+183", false, false);
yield return new(143.29037716090784, 7.105427357601002e-15, "1.69910458106426676554498095736585717279629861080725638335770561432172175567179296935807251115412696313306724901224512233e+62", false, false);
yield return new(-423.8235075138234, 1.4210854715202004e-14, "8.62560141770186405333837436070283907622016892778266665614001106958891092867882075683909911596340580037798946754919642625e-185", false, false);
yield return new(629.674319423568, 2.842170943040401e-14, "2.91126890565240823415617400543001298046759607283544328129671913746688713656878438331162306480748398370464034912656538820e+273", false, false);
yield return new(476.4269335621673, -1.4210854715202004e-14, "8.12060294229288638705696742243171138798739665557121126671332272759247891668245193155034259725461712382725662571286328498e+206", false, false);
yield return new(-368.34418334630294, 0.0, "1.07189866873214564227512329996676053698526755024574933331009054494690554598611201496714891396418441980287847271648619119e-160", false, false);
yield return new(426.4512284367213, -1.4210854715202004e-14, "1.60477928954337675596913772689313867604252233210913944130610314719949644668929549587347071785910635667889989102565389825e+185", false, false);
yield return new(479.86137038088054, -1.4210854715202004e-14, "2.51851901957090131714532718528724969599767014021536310616673466220572163252337149568927768479497181122240432259582720596e+208", false, false);
yield return new(-458.3944799990166, 0.0, "8.35231377927775218836210866940849971238309323325966833772571623639636233470609261119570813125493442264451177020245725980e-200", false, false);
yield return new(538.8101651044019, 2.842170943040401e-14, "1.00526716680082389057516886078501218166744951626822418570724905419153238061072192210420764844166330970451459803220906064e+234", false, false);
yield return new(22.15213573331414, 0.0, "4.17397949616325110413321154114872752301685074292041043266359355399670536385253098257197408148405435207860488381883513019e+9", false, false);
yield return new(-51.90429048611031, -1.7763568394002505e-15, "2.87245381635063414910033235658339814147961186337133527534688133490396795511401749977209274215841849929304105540758920696e-23", false, false);
yield return new(-51.33803587753391, 0.0, "5.06027718442234840278246183085295466388263540807401073576769499575972033255888967982821328436275583313102789498414627886e-23", false, false);
yield return new(78.05831181158169, 0.0, "7.94866303462243425204940421651969283685027124482927854333515042019832522257210762641135714348485410603557283113270732409e+33", false, false);
yield return new(-316.89104991186997, 0.0, "2.37665234860086424272893806792451564054593665854702908033635903304590570912375914584571052456884643028797821719093752027e-138", false, false);
yield return new(668.7714217752093, 2.842170943040401e-14, "2.77803767716926480494800178117846676667419303570622327706434084588631083247004295466580385823262031268378610965263286457e+290", false, false);
yield return new(680.4864668830899, 0.0, "3.40030267543412741152392668476743059322750613469336046861812545068307651919878546978662568628106438922784868779400103430e+295", false, false);
yield return new(275.71601844842723, -1.4210854715202004e-14, "5.52008016117627051627152920015720966988197938268556791192203183220632953095782874708811497365849400280981205969332198486e+119", false, false);
yield return new(-445.6698625965356, -1.4210854715202004e-14, "2.80567862654187847604022917362207614349765382476878153191064333889161447799670762325599971073801061363353306265601322090e-194", false, false);
yield return new(-63.196571231196685, -1.7763568394002505e-15, "3.58160624879422249528597632394783307195564100672359124415465535507181915793102312788603160456494554789864577247762191305e-28", false, false);
yield return new(370.73764411121806, 0.0, "1.02167571709662012978574521531875120712692242187318883974159061205711055222696447285491174555985669578559375428948854122e+161", false, false);
yield return new(-297.65730157570334, -1.4210854715202004e-14, "5.35890955697308980286448789307533538423483927729590658159776633608813867634004664534327700429045233632021246170217834155e-130", false, false);
yield return new(283.2479106439273, -1.4210854715202004e-14, "1.03039704202642657253556757179516153171083463765491588891988142833578829377235736191937905583732953725199623748172081520e+123", false, false);
yield return new(-518.9819357755157, -2.842170943040401e-14, "4.06451831847497777816889222884393558777703001718953458869677781770344080189877096252012563041130823926324789673724650773e-226", false, false);
yield return new(-50.320556127609734, -1.7763568394002505e-15, "1.39978117139718859819863665563900537372395285581185827197311567520765034232601834712067644793536298774148624623034543328e-22", false, false);
yield return new(553.0078744642244, -2.842170943040401e-14, "1.47322245183432396109529090272988975308921754523662465588290740021678908366347295670482551934394980803464184301611683360e+240", false, false);
yield return new(700.9099225705045, 0.0, "2.51948445769605651281865534108754855840994232758280747431580065979256545734618453121372551962883920654131999989381658498e+304", false, false);
yield return new(-368.59132743760546, 0.0, "8.37183030004208089829601116432266660615386985125431719869880517751238808255922308293853954259961164152754274661498047061e-161", false, false);
yield return new(328.8733893109577, -1.4210854715202004e-14, "6.72818961878776146403138851632284099752609914026170349199759193545557728855066071501314204583390866559046090953468206243e+142", false, false);
yield return new(-610.2870785426633, 0.0, "9.03003455177174550370231202399628038036615647679105750340330198051262714767221590915931500139966794363406159117503327824e-266", false, false);
yield return new(-581.2546837986364, -2.842170943040401e-14, "3.66689307098811069067275969821613749270864903693004508139617801537624853168654845472153786838567309217248540607768843249e-253", false, false);
yield return new(-114.5097069209985, -3.552713678800501e-15, "1.85808749214386363163181505554519377650587478351484284594423052682961728058550691220149552276527736261050470011694929003e-50", false, false);
yield return new(521.0379652843721, 2.842170943040401e-14, "1.92270734380839515146378592887983586527243497084997837991903378964791939745280502327150133412346088529014809612926287624e+226", false, false);
yield return new(-600.5976234266386, 0.0, "1.45802946825777425002695195523435767399837623785465460104305729127484442506900496205120509000552052237306914948989227727e-261", false, false);
yield return new(156.76771107759794, 7.105427357601002e-15, "1.21157934703874853208402110193986981961128727852944443971417079776461292903800750665673754307027799036455276265139549098e+68", false, false);
yield return new(-12.124513857574584, 0.0, "5.42488499644416622198292172219508941513166896980567291469536104301462655420573713311933423453355344948759787516398833345e-6", false, false);
yield return new(373.9755141606854, 0.0, "2.60316781987619970722038101347946282085158528596016586218322621458813194735970522205720405210680856132824807566904879478e+162", false, false);
yield return new(375.26461514720745, 1.4210854715202004e-14, "9.44825513040578675525433634793575467471294044207769959106617371776345135511357106724480519815890519557146956438373988037e+162", false, false);
yield return new(-689.1596165170188, -2.842170943040401e-14, "5.03247233472804965833871575507697166950606622972855041665935520474597867753723374557081305250047844215301516976719865727e-300", false, false);
yield return new(-312.1235287317174, 0.0, "2.79559206848027600375115462040233124955803374302019050582380980651757208279877966165499851325871988914638995417450938999e-136", false, false);
yield return new(-133.06689171337143, 0.0, "1.62100070923576246803197781971151295182423957024412949227531594102988445341130109909474534069052557352765861144623829228e-58", false, false);
yield return new(-254.20225857809788, 0.0, "3.99357469858050864608094079295922954579211212807546160012977550249667824153573606447596589831836861960941172944931990910e-111", false, false);
yield return new(676.3319663707205, -2.842170943040401e-14, "5.33630850896694003088409252604851275462002766178050073311880947905507851875529691122415439606328166567203553952001244692e+293", false, false);
yield return new(-706.856363295316, 2.842170943040401e-14, "1.03796311959384047269560572543315424002832228807597493054203283134095874767677999346098214050756029820148086656866449500e-307", false, false);
yield return new(-321.6074172290768, 0.0, "2.12653903094307091968997276897533902009517724207538497104299769233738462949856937324839393966493458428170759897966317386e-140", false, false);
yield return new(530.0103082638502, 0.0, "1.51548705420569333736515520300213169536404663561653368881742543596551835921772411626185899434218839970435748127546863333e+230", false, false);
yield return new(-632.4314892813157, 0.0, "2.18018839337579371462595491713918434980113546320929398840766068190832264325541464216958223258404298705380414106594679351e-275", false, false);
yield return new(-744.0934983311013, -1.6734828315645128e-14, "6.98714337051313208006513446568231545566129872588002558750780914808909866701214909457154693533604169836362338613080224250e-324", false, false);
yield return new(-744.0934983311013, -1.6734828315645125e-14, "6.98714337051313208006513446570436299263798664931223523569236371622341671373383558538575129031830746639726406475076323379e-324", false, false);
yield return new(-744.0934983311013, -1.6734828315645122e-14, "6.98714337051313208006513446572641052961467457274444488387698785411764405551605568920340969374288798018039391277794795236e-324", false, false);
yield return new(-708.0498449419841, 1.4198372307141562e-17, "3.14672962798271731045847070985629106088699236009000980727234726565331391383038580428293839493380169291658401750047165864e-308", false, false);
yield return new(-708.0498449419841, 1.4198372307141565e-17, "3.14672962798271731045847070985630075749630023596539305130557283034804177172470054654328726324540926548252079287005793150e-308", false, false);
yield return new(-708.0498449419841, 1.4198372307141568e-17, "3.14672962798271731045847070985631045410560811184077629533879839507264961397911470994425694741254153140687443200811191282e-308", false, false);
yield return new(-68.96814446571456, 7.456617379421123e-16, "1.11561779098947160050654927371985600558349664444602144912738553521318307418367932341913272749412369839422242780361827541e-30", false, false);
yield return new(-68.96814446571456, 7.456617379421124e-16, "1.11561779098947160050654927371996601399105672196031937693806128765144077546776758192288876925858663133336610322423957358e-30", false, false);
yield return new(-68.96814446571456, 7.456617379421125e-16, "1.11561779098947160050654927372007602239861679947461730474873705093736497297244916099361400389805842727246296264699643156e-30", false, false);
yield return new(-0.34657359027997264, -1.15952340692315e-17, "7.07106781186547524400844362104848151612304016521768062766184095177317868787098221547883491708208520216770705605342969881e-1", false, false);
yield return new(-0.34657359027997264, -1.1595234069231498e-17, "7.07106781186547524400844362104849241082803029677627932443209212280977313377656339550830356371094219315922922799519634988e-1", false, false);
yield return new(-0.34657359027997264, -1.1595234069231496e-17, "7.07106781186547524400844362104850330553302042833487802120234329386315353054275210640598629277933666467823289978569644651e-1", false, false);
yield return new(0.34657359027997264, 1.1595234069231496e-17, "1.41421356237309504880168872420969549603273966508692054211289081721355029737587236309267408766401076839916562119664190298e+0", false, false);
yield return new(0.34657359027997264, 1.1595234069231498e-17, "1.41421356237309504880168872420969767497373769139864028146694105141962551056486401694834996183830158716180954825537363348e+0", false, false);
yield return new(0.34657359027997264, 1.15952340692315e-17, "1.41421356237309504880168872420969985391473571771036002082099128562905791392597717697766865250049990011376350780526255283e+0", false, false);
yield return new(1.0397207708399179, 9.029685343895231e-17, "2.82842712474619009760337744841937194615375838376685200255442501457434266339029106280223940880053175190088420610575172932e+0", false, false);
yield return new(1.0397207708399179, 9.029685343895233e-17, "2.82842712474619009760337744841940680920972680475436783221922876182478973716319216070042518126223590258867505878691328487e+0", false, false);
yield return new(1.0397207708399179, 9.029685343895234e-17, "2.82842712474619009760337744841944167226569522574188366188403250950495715296764604882489146417610105050336646721858234510e+0", false, false);
yield return new(69.6612916462745, -2.6098504116664157e-15, "1.79272867119315647739942202327822996688215022175625432702918581683349268499311642632218490128850388464907533865651844537e+30", false, false);
yield return new(69.6612916462745, -2.6098504116664153e-15, "1.79272867119315647739942202327893707366333676928065517139129063511662062655938770611903772921628746828416148034401316475e+30", false, false);
yield return new(69.6612916462745, -2.609850411666415e-15, "1.79272867119315647739942202327964418044452331680505601575339573230419631549355911255320898716561617353758241085835942027e+30", false, false);
yield return new(709.436139303104, -3.742575719755748e-15, "1.27116100615364628366052028422166464684592199326463133372226049039050942560031704291012837907965430323512928214131252068e+308", false, false);
yield return new(709.436139303104, -3.7425757197557475e-15, "1.27116100615364628366052028422266741606791801082994866523623326288452676207760135309929657872233499545627151368812022258e+308", false, false);
yield return new(709.436139303104, -3.742575719755747e-15, "1.27116100615364628366052028422367018528991402839526599675020682642398029010304480006949308090339417672525743758652416348e+308", false, false);
yield return new(709.782712893384, 2.3691528222554846e-14, "1.79769313486231580793728971404631370472204944707885473394255307689401631566863219557545655233948936948926513968471917798e+308", false, false);
yield return new(709.782712893384, 2.369152822255485e-14, "1.79769313486231580793728971405198622405675778669468436196455240891719566132544008818951355194454679628152242602530089901e+308", false, false);
yield return new(709.782712893384, 2.3691528222554853e-14, "1.79769313486231580793728971405765874339146612631051398998656964025532405383200713096445663417114297060553540946791444483e+308", true, false);
yield return new(-745.1332191019412, 1.4483164125345334e-14, "2.47032822920623272088284396433590095345751794342251487469159645225458355532063237365273213340616393668071835655093600486e-324", false, true);
yield return new(-745.1332191019412, 1.4483164125345337e-14, "2.47032822920623272088284396434369593490985653493344559708025208329260790709241093449531658811559842016575818889409610114e-324", false, false);
yield return new(-745.1332191019412, 1.448316412534534e-14, "2.47032822920623272088284396435149091636219512644437631946893231095513095013854817700656741929810891355035946163931074223e-324", false, false);
yield return new(-708.3964185322641, -2.7475416721234717e-14, "2.22507385850720138309023271732581699273775735905523668221876285481696276077167221243465939524364681713293424068277841922e-308", false, false);
yield return new(-708.3964185322641, -2.7475416721234714e-14, "2.22507385850720138309023271733283808785057976074613640353332163334505201319700046987868417717830168695105609212481717356e-308", false, false);
yield return new(-708.3964185322641, -2.747541672123471e-14, "2.22507385850720138309023271733985918296340216243703612484790256654292664122956476343262942517386336190821248359185503623e-308", false, false);
}
}
@@ -0,0 +1,370 @@
// Generated by generate_log.py; do not hand-edit reference literals.
// Exact binary64 sums; Decimal.ln at 450/650 digits, rounded to 120 digits.
using Xunit;
namespace Just.PreciseMath.Tests.ReferenceData;
internal static class LogReferenceData
{
internal const string Ln2 = "6.93147180559945309417232121458176568075500134360255254120680009493393621969694715605863326996418687542001481020570685734e-1";
internal static IEnumerable<TheoryDataRow<string, double, double, string>> Cases()
{
yield return new("scalar-boundary", 0.5, 0.0, "-6.93147180559945309417232121458176568075500134360255254120680009493393621969694715605863326996418687542001481020570685734e-1");
yield return new("scalar-boundary", 0.75, 0.0, "-2.87682072451780927439219005993827431503509710897761056506665685349292950720780464338110899179105286296032932975183505725e-1");
yield return new("scalar-boundary", 1.0, 0.0, "0e+0");
yield return new("scalar-boundary", 1.25, 0.0, "2.23143551314209755766295090309834503374601085548007213671287872487391743768268333418407224100342235715963340980574191432e-1");
yield return new("scalar-boundary", 1.5, 0.0, "4.05465108108164381978013115464349136571990423462494197614014324144100671248914251267752427817313401245968548045387180009e-1");
yield return new("scalar-boundary", 2.0, 0.0, "6.93147180559945309417232121458176568075500134360255254120680009493393621969694715605863326996418687542001481020570685734e-1");
yield return new("scalar-boundary", 3.0, 0.0, "1.09861228866810969139524523692252570464749055782274945173469433363749429321860896687361575481373208878797002906595786574e+0");
yield return new("scalar-boundary", 10.0, 0.0, "2.30258509299404568401799145468436420760110148862877297603332790096757260967735248023599720508959829834196778404228624863e+0");
yield return new("scalar-boundary", 1e-308, 0.0, "-7.09196208642166070768214742705535718056499206129486573599521955618807812050464614812913346536250943616410303237117193125e+2");
yield return new("scalar-boundary", 1e+308, 0.0, "7.09196208642166070688520431672224631298274262504784082648747879520031161982884765147137142868601202852269278974627923400e+2");
yield return new("scalar-boundary", 1.7976931348623157e+308, 0.0, "7.09782712893383996732223389910657145503973148736664163038603057714706059319168681439891107972015703395856598605178249443e+2");
yield return new("scalar-boundary", 2.2250738585072014e-308, 0.0, "-7.08396418532264106224411228130256452573161137316180869711334969702248281653027999349192320190339898667925513603023240820e+2");
yield return new("scalar-boundary", 5e-324, 0.0, "-7.44440071921381262314107298446081634113087144302914142925610330195904749995452124560697213194153670420109590616092916478e+2");
yield return new("scalar-boundary", 1.5e-323, 0.0, "-7.43341459632713152622712053209159108408439653745091393473875635862267255702233515593823597439339938331321620587026958612e+2");
yield return new("scalar-boundary", 2.225073858507201e-308, 0.0, "-7.08396418532264106446455833055287785309790759090967500542603480667714539155580874557210156054295995063386242753419205882e+2");
yield return new("scalar-boundary", 2.225073858507202e-308, 0.0, "-7.08396418532264106002366623205225169140338091854632077113101788912136811397334572694788857479320939242416211452756353776e+2");
yield return new("scalar-boundary", 0.9999999999999999, 0.0, "-1.11022302462515660205338988848237217180973272006529009577798707340512938872317032647152917959886132748594421808576780172e-16");
yield return new("scalar-boundary", 1.0000000000000002, 0.0, "2.22044604925031283432823045461548792598233180790111470255693426654403462711018959425509302150266887043618910734836177242e-16");
yield return new("binade-residual", 1e-323, 0.0, "-7.43746924740821317004690066324623457545011644168553887671489650186411356373482429845091349867157251732567589135072345792e+2");
yield return new("binade-residual", 1e-323, -0.0, "-7.43746924740821317004690066324623457545011644168553887671489650186411356373482429845091349867157251732567589135072345792e+2");
yield return new("binade-residual", 1.5e-323, 0.0, "-7.43341459632713152622712053209159108408439653745091393473875635862267255702233515593823597439339938331321620587026958612e+2");
yield return new("binade-residual", 1.5e-323, -0.0, "-7.43341459632713152622712053209159108408439653745091393473875635862267255702233515593823597439339938331321620587026958612e+2");
yield return new("binade-residual", 3.337610787760802e-308, 0.0, "-7.07990953424155941842433215014792103436589146892718375513720955378104180981779085097924567762522585266679545054977853640e+2");
yield return new("binade-residual", 3.337610787760802e-308, -0.0, "-7.07990953424155941842433215014792103436589146892718375513720955378104180981779085097924567762522585266679545054977853640e+2");
yield return new("binade-residual", 1.3998954277548283e-301, 5.180654e-318, "-6.92741715451837144998246674188540334942915513004782591476234306024086236510959867110624259277052835341389174548385802125e+2");
yield return new("binade-residual", 1.3998954277548283e-301, -5.180654e-318, "-6.92741715451837145072261542496884104304490957544170646098593110152584281546877674062719233462108321833459887414496043835e+2");
yield return new("binade-residual", 4.582404545249407e-151, 1.695830344760954e-167, "-3.46168125171864490289630613459452050905165445824654964415894301277389425526112509307692595778843491570388434038100459258e+2");
yield return new("binade-residual", 4.582404545249407e-151, -1.695830344760954e-167, "-3.46168125171864490363645481767795820266740890364043019038253105405887470562030316259787569963898978062459146904210700968e+2");
yield return new("binade-residual", 0.75, 2.7755575615628914e-17, "-2.87682072451780890431784851821943435490878778887592609674976540186008163234846220366795607630566486929695008835687076687e-1");
yield return new("binade-residual", 0.75, -2.7755575615628914e-17, "-2.87682072451780964446653160165712797066323318275647232033780668684053199152653172461769792686052979000407874945928786604e-1");
yield return new("binade-residual", 1.5, 5.551115123125783e-17, "4.05465108108164418985447269636233132584621355472662644445703469307385458734848495239067719365852200612306472184883609047e-1");
yield return new("binade-residual", 1.5, -5.551115123125783e-17, "4.05465108108164344970578961292463771009176816084608022086899340809340422817041543144093534310365708541593606074641899130e-1");
yield return new("binade-residual", 3.0, 1.1102230246251565e-16, "1.09861228866810972840267939109440970066012148983291789856638347880077908070454321084493104636227088815430795320545429478e+0");
yield return new("binade-residual", 3.0, -1.1102230246251565e-16, "1.09861228866810965438781108275064033908467695044486327620757935030273404478673625874995686130678439608359508709521258486e+0");
yield return new("binade-residual", 4.910085911844213e+150, 1.8170968107390172e+134, "3.46979055388080819127601507998724517170334688535600289704785708216004196443582206298170731217575195971613046982470226476e+2");
yield return new("binade-residual", 4.910085911844213e+150, -1.8170968107390172e+134, "3.46979055388080819053586639690380747808759243996212235082426904087506151407664399346075757032519709479542334116359984766e+2");
yield return new("binade-residual", 1.607262910779401e+301, 5.948067633911132e+284, "6.93552645668053473836217568727812801208084755715727916765125712962701007428429564101102394715784539742613787492755569343e+2");
yield return new("binade-residual", 1.607262910779401e+301, -5.948067633911132e+284, "6.93552645668053473762202700419469031846509311176339862142766908834202962392511757149007420530729053250543074626645327633e+2");
yield return new("binade-residual", 1.348269851146737e+308, 4.9896007738368e+291, "7.09495030820932215952813907521350862273821258806013787609901353181049060733732542560037251236702169556079821556228695115e+2");
yield return new("binade-residual", 1.348269851146737e+308, -4.9896007738368e+291, "7.09495030820932215878799039213007092912245814266625732987542549052551015697814735607942277051646683064009108690118453405e+2");
yield return new("dense-and-sparse-low", 1.0, 5.551115123125783e-17, "5.55111512312578254804376278947523901991981278988962222756935407097214122011139871925366705050830882669262574760778067005e-17");
yield return new("dense-and-sparse-low", 1.0, -5.551115123125783e-17, "-5.55111512312578285619255389143297550887628360347846797205290577537162612061508410873614140186086447543174169782788199333e-17");
yield return new("dense-and-sparse-low", 1.0, 5e-324, "4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717731e-324");
yield return new("dense-and-sparse-low", 1.0, -5e-324, "-4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717731e-324");
yield return new("dense-and-sparse-low", 1.4142135623730951, 5.551115123125783e-17, "3.46573590279972762319014104442688659671716864637094695515049679517467599837002227654089704889504065050849641729800500694e-1");
yield return new("dense-and-sparse-low", 1.4142135623730951, -5.551115123125783e-17, "3.46573590279972683814391170253941056428409466580831394082532128005304637509765529554847792137300830845936178205520483110e-1");
yield return new("dense-and-sparse-low", 1.4142135623730951, 5e-324, "3.46573590279972723066702637348315628422040920503198944881264796842348666517011773698650502597569728491755588352148233771e-1");
yield return new("dense-and-sparse-low", 1.4142135623730951, -5e-324, "3.46573590279972723066702637348315628422040920503198944881264796842348666517011773698650502597569728491755588352148233771e-1");
yield return new("dense-and-sparse-low", 0.7071067811865475, 2.7755575615628914e-17, "-3.46573590279972704107463885392989277866220104990058184223518283400496728900287858458871962848692346392866619375346293000e-1");
yield return new("dense-and-sparse-low", 0.7071067811865475, -2.7755575615628914e-17, "-3.46573590279972782612086819581749207061171581356031175347864947360671570368363110333238322211099529983256535607887100419e-1");
yield return new("dense-and-sparse-low", 0.7071067811865475, 5e-324, "-3.46573590279972743359775352487368472091718088278566868656686869387741023062048936894230586271486699391336036720393083281e-1");
yield return new("dense-and-sparse-low", 0.7071067811865475, -5e-324, "-3.46573590279972743359775352487368472091718088278566868656686869387741023062048936894230586271486699391336036720393083281e-1");
yield return new("dense-and-sparse-low", 1e-308, 0.0, "-7.09196208642166070768214742705535718056499206129486573599521955618807812050464614812913346536250943616410303237117193125e+2");
yield return new("dense-and-sparse-low", 1e-308, -0.0, "-7.09196208642166070768214742705535718056499206129486573599521955618807812050464614812913346536250943616410303237117193125e+2");
yield return new("dense-and-sparse-low", 1e-308, 5e-324, "-7.09196208642166070274149096864289251131762200167613195674938503746430392194065974069815567083296570136442525903288022385e+2");
yield return new("dense-and-sparse-low", 1e-308, -5e-324, "-7.09196208642166071262280388546782429082098612619462831352666454845973432433339361150276213513067916270195665710547011677e+2");
yield return new("dense-and-sparse-low", 1e+308, 4.9896007738368e+291, "7.09196208642166070738416439410592624797066342402470115489149213421715159219499476833641331264382087753975660047482346581e+2");
yield return new("dense-and-sparse-low", 1e+308, -4.9896007738368e+291, "7.09196208642166070638624423933856635309870594379819236016005430228146051273780234736132682012863970259151949715225658597e+2");
yield return new("dense-and-sparse-low", 1e+308, 5e-324, "7.09196208642166070688520431672224631298274262504784082648747879520031161982884765147137142868601202852269278974627923400e+2");
yield return new("dense-and-sparse-low", 1e+308, -5e-324, "7.09196208642166070688520431672224631298274262504784082648747879520031161982884765147137142868601202852269278974627923400e+2");
yield return new("dense-and-sparse-low", 1.7976931348623157e+308, 4.9896007738368e+291, "7.09782712893383996759978965526286061710865862581065128842256906430267355581830559839919701739706054194775887134219886231e+2");
yield return new("dense-and-sparse-low", 1.7976931348623157e+308, -4.9896007738368e+291, "7.09782712893383996704467814295028228526708457137368684955616586064623699207202911664565057018537306512592047080659757912e+2");
yield return new("dense-and-sparse-low", 1.7976931348623157e+308, 5e-324, "7.09782712893383996732223389910657145503973148736664163038603057714706059319168681439891107972015703395856598605178249443e+2");
yield return new("dense-and-sparse-low", 1.7976931348623157e+308, -5e-324, "7.09782712893383996732223389910657145503973148736664163038603057714706059319168681439891107972015703395856598605178249443e+2");
yield return new("tiny-delta-transition", 1.0, 5.551115123125782e-17, "5.55111512312578193174618058555980025339516034281335266714530226183324421924014036523576597556487514804335114092086815729e-17");
yield return new("tiny-delta-transition", 1.0, 5.551115123125783e-17, "5.55111512312578254804376278947523901991981278988962222756935407097214122011139871925366705050830882669262574760778067005e-17");
yield return new("tiny-delta-transition", 1.0, 5.551115123125784e-17, "5.55111512312578378063892719730611655296911768403076666712254593201803108431810380710527849389475544150871691764305007084e-17");
yield return new("tiny-delta-transition", 1.0, -5.551115123125784e-17, "-5.55111512312578408878771829926398988747874521805188771546643147070735642826257077595207564459747427983393192339059396215e-17");
yield return new("tiny-delta-transition", 1.0, -5.551115123125783e-17, "-5.55111512312578285619255389143297550887628360347846797205290577537162612061508410873614140186086447543174169782788199333e-17");
yield return new("tiny-delta-transition", 1.0, -5.551115123125782e-17, "-5.55111512312578223989497168751746831957505279619745544099359880758477678874690941895886206681716329351288934486206991599e-17");
yield return new("near-one-log", 1.0, -1.1102230246251565e-16, "-1.11022302462515660205338988848237217180973272006529009577798707340512938872317032647152917959886132748594421808576780172e-16");
yield return new("near-one-log", 1.0, 1.1102230246251565e-16, "1.11022302462515647879387344769927757622714439462918206391982080372048703398552244739719073774257396234750928387487501506e-16");
yield return new("near-one-log", 1.0, -5.551115123125783e-17, "-5.55111512312578285619255389143297550887628360347846797205290577537162612061508410873614140186086447543174169782788199333e-17");
yield return new("near-one-log", 1.0, 5.551115123125783e-17, "5.55111512312578254804376278947523901991981278988962222756935407097214122011139871925366705050830882669262574760778067005e-17");
yield return new("near-one-log", 1.0, -2.7755575615628914e-17, "-2.77555756156289138957767805797176855510681487628406684506302695438880395947804941709393049346926362876035846181449326792e-17");
yield return new("near-one-log", 1.0, 2.7755575615628914e-17, "2.77555756156289131254048028248233443286769717288694442988975552640219029599840521330023020544226990000279505685795070567e-17");
yield return new("near-one-log", 1.0, -7.888609052210118e-31, "-7.88860905221011805411728565283097380437099492194380207972968100512540855865987828215720222136742381986785142640828800125e-31");
yield return new("near-one-log", 1.0, 7.888609052210118e-31, "7.88860905221011805411728565282475078909313378023665801567590088088481830649115711502410110281633816360915690655808873978e-31");
yield return new("near-one-log", 1.0, -3.054936363499605e-151, "-3.05493636349960468205197939321361769978940274057232666389361390928129162652472045770185723510801522825687515269359046716e-151");
yield return new("near-one-log", 1.0, 3.054936363499605e-151, "3.05493636349960468205197939321361769978940274057232666389361390928129162652472045770185723510801522825687515269359046716e-151");
yield return new("near-one-log", 1.0, -9.332636185032189e-302, "-9.33263618503218878990089544723817169617091446371708024621714339795966910975775634454440327097881102359594989930324242624e-302");
yield return new("near-one-log", 1.0, 9.332636185032189e-302, "9.33263618503218878990089544723817169617091446371708024621714339795966910975775634454440327097881102359594989930324242624e-302");
yield return new("near-one-log", 1.0, -2.2250738585072014e-308, "-2.22507385850720138309023271733240406421921598046233183055332741688720443481391819585428315901251102056406733973103581101e-308");
yield return new("near-one-log", 1.0, 2.2250738585072014e-308, "2.22507385850720138309023271733240406421921598046233183055332741688720443481391819585428315901251102056406733973103581101e-308");
yield return new("near-one-log", 1.0, -1e-323, "-9.88131291682493088353137585736442744730119605228649528851171365001351014540417503730599672723271984759593129390891435462e-324");
yield return new("near-one-log", 1.0, 1e-323, "9.88131291682493088353137585736442744730119605228649528851171365001351014540417503730599672723271984759593129390891435462e-324");
yield return new("near-one-log", 1.0, -5e-324, "-4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717731e-324");
yield return new("near-one-log", 1.0, 5e-324, "4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717731e-324");
yield return new("centering-transition", 1.414213562373095, 5.551115123125783e-17, "3.46573590279972605309768236065187290209280029370197069897161726092896893069406857146991364147726341149134861645224392734e-1");
yield return new("centering-transition", 1.414213562373095, -5.551115123125783e-17, "3.46573590279972526805145301876427361014328553004224078772815062132722051601331605272625004785319157558744945412683585314e-1");
yield return new("centering-transition", 1.4142135623730951, 5.551115123125783e-17, "3.46573590279972762319014104442688659671716864637094695515049679517467599837002227654089704889504065050849641729800500694e-1");
yield return new("centering-transition", 1.4142135623730951, -5.551115123125783e-17, "3.46573590279972683814391170253941056428409466580831394082532128005304637509765529554847792137300830845936178205520483110e-1");
yield return new("centering-transition", 1.4142135623730954, 5.551115123125783e-17, "3.46573590279972919328259972820165377230865543290378806866019876791680308319312476084747743624682307309030667693834929923e-1");
yield return new("centering-transition", 1.4142135623730954, -5.551115123125783e-17, "3.46573590279972840823637038631430099939202223539954618380837792049014469067476413195337201223190594763042314472407910071e-1");
yield return new("centering-transition", 0.7071067811865474, 2.7755575615628914e-17, "-3.46573590279972861116709753770515299231945096878310477597311285244029449676984761802098027382510047059480729103877820172e-1");
yield return new("centering-transition", 0.7071067811865474, -2.7755575615628914e-17, "-3.46573590279972939621332687959287554378540651557863735157980709153879933537217919526335172083934142250469208180880204089e-1");
yield return new("centering-transition", 0.7071067811865475, 2.7755575615628914e-17, "-3.46573590279972704107463885392989277866220104990058184223518283400496728900287858458871962848692346392866619375346293000e-1");
yield return new("centering-transition", 0.7071067811865475, -2.7755575615628914e-17, "-3.46573590279972782612086819581749207061171581356031175347864947360671570368363110333238322211099529983256535607887100419e-1");
yield return new("centering-transition", 0.7071067811865476, 2.7755575615628914e-17, "-3.46573590279972547098218017015487908403783269723160558605630329975926022132692487951773622106914622491151839290770185040e-1");
yield return new("centering-transition", 0.7071067811865476, -2.7755575615628914e-17, "-3.46573590279972625602840951204235511647090667779423860038147881488088984459929186051015534859117856696065302815050202624e-1");
yield return new("random-000", 3.2687197963818576e-121, 0.0, "-2.77428397843603746707145265857773809749514404322830220361999004599384203108239391987481055099689888229526502850906397621e+2");
yield return new("random-001", 8.720956744645523e-63, -2.698802673467014e-79, "-1.42897131908299963994093348186618128801296795907406501436196467580118968875539154912687857009556283687475257673288325394e+2");
yield return new("random-002", 4.178989384093167e-23, 0.0, "-5.15293876956988558054989200772155883666233844447831826313248291496465254131675273008534517596803944491229593207853084815e+1");
yield return new("random-003", 2.8432667181955728e+85, -8.627182933488205e+68, "1.96764686548518767866436001207058242004350551097745308211869172546615830167670713395190984137587028816314312521460958731e+2");
yield return new("random-004", 2.7381182414021697e-115, -1.1270725851789228e-131, "-2.63790014783062912940067233921000975920281831006824611081171958192539570255315929422501789301122230605068053710790124022e+2");
yield return new("random-005", 4.6600611214593755e+66, 0.0, "1.53509644701851552188489577504396933769831338203738388795304096546018812135130602174589848122670676620350435527333676317e+2");
yield return new("random-006", 3.8379699052985617e-10, 1.2924697071141057e-26, "-2.16809073736315064622005455624638400390629609444453346240107329199181368270444791392186611313699585577524416327990575624e+1");
yield return new("random-007", 4.733558283596678e-290, 0.0, "-6.66194999768759882487560012470595706257992321124924103914523794015466606601665600957089034872762275001248863229309538788e+2");
yield return new("random-008", 3.429947298221616e-142, 0.0, "-3.25734538309044646864355609571522247610094874664843799549821725069188417008662368608104227339778060972045551759486978273e+2");
yield return new("random-009", 9.823582750843692e-65, -4.2168791772922093e-81, "-1.47383245146540567979731229659714140218541121668590642274014152707266235887217612538435052658720651624377054252165392909e+2");
yield return new("random-010", 8.973051050007222e+197, -3.3196124551047944e+181, "4.55803489077417633801838012843828946341911805516998669607783700730706516827509813777626141848305121477462173618190165179e+2");
yield return new("random-011", 12452068950.583649, 0.0, "2.32451526268204041966204005537989353487078801574272406601027293067219693454354951773182517177281518560241759944436286611e+1");
yield return new("random-012", 3.046604700155709e+171, 1.0726246343954078e+155, "3.94856078659455536181750974311851484526991436855509299368684979468449550768655585183107557613988913830388046655015486893e+2");
yield return new("random-013", 8.672562321844979e+100, 3.885337784451458e+84, "2.32418673585385800353698607677131372129553153547764602764969731854766153611008701858676738005553735159369744410490100730e+2");
yield return new("random-014", 1.875040757115516e+211, 5.83992399055641e+194, "4.86474085018058040697837112361363330538677811304980968278689131607902849565853243224554356532164530593020061884379739771e+2");
yield return new("random-015", 4.865697254154056e+264, 2.2374143686308563e+248, "6.09464674576280505566366550232856781744457764500982369586173585048502300326305529692486006211504953372295994274830764889e+2");
yield return new("random-016", 186154638529016.28, 0.0, "3.28575988341695156872867707224398708730107219992792835589580148440953184813046313060657719214620210672712440451381552373e+1");
yield return new("random-017", 6.265891621404726e-27, 0.0, "-6.03346766147555403738512972253117640556383494304418466818940356529745333722024356152101462071040260574239928826344792137e+1");
yield return new("random-018", 2.7464787128253256e-133, -9.775796363198735e-150, "-3.05233497745092835464403053727706854474582001351884662319968729562730223426535649264796640585802940153740809754099601713e+2");
yield return new("random-019", 7.318032322318495e+270, -2.346099009001469e+254, "6.23688316591803658883057257261425085076350137467494378995501900769505833017418531272666405349600164976698883567057977409e+2");
yield return new("random-020", 1.1212275935340022e-159, 0.0, "-3.65996605635332299306008068788037714895707680368354975882536787504286844048878981110688374714757010362756315009225060364e+2");
yield return new("random-021", 6.005811999442809e-218, 0.0, "-5.00170822605754816714145112212495369901434998610162582952201898612087420561325150204333486218340214608209805797834300300e+2");
yield return new("random-022", 1.036031222705667e-47, 3.0385816786431356e-64, "-1.08186102089590205754966237067040030855267374973619233774877273264923085591554671581719125052123502944261145680885420734e+2");
yield return new("random-023", 1.93412225876824e-306, 0.0, "-7.03931384845649421348195021348200445008254006448094723149044024509922630904917748710335052971744931549525040938157437453e+2");
yield return new("random-024", 3.800973493036955e+216, 1.5309010345804195e+200, "4.98693637303015251841274802231915407959001588807331688449872851852270936072487191741238042395349552543151842443412210066e+2");
yield return new("random-025", 4.5658176573322356e-138, -1.4916681462400413e-154, "-3.16238145220749364181996306616117930142470092488719576487838122456804538994345185476701875042357109460230626279464434595e+2");
yield return new("random-026", 1.4870787534218449e-230, 0.0, "-5.29197757761275907247694319221367678765966452964762185077311988709311628432726142129939262342085142032121446914852992467e+2");
yield return new("random-027", 4.733183001400619e+275, 0.0, "6.34765498488529825676790725207789188410025085160415986116765312337544304502844471989373599142527230723194649521497355601e+2");
yield return new("random-028", 2.752730384372096e-299, -1.32624737e-315, "-6.87460349519063256593764081860773071032080240533437218991103408664749672834637152587612289023458365299079697791316180421e+2");
yield return new("random-029", 5.9254629327981404e-167, -1.8827498946116282e-183, "-3.82752451713918759715551809348192784480457767998762407315702322880599165789885338733811775631356145303105526979038737973e+2");
yield return new("random-030", 4.170970801662931e-99, -2.0303534698525194e-115, "-2.26527775391540780054707965695072804635998775850584226283222822022334977372669941450403449311176149253385396782787033456e+2");
yield return new("random-031", 9.650932554504794e+130, -4.92525077454931e+114, "3.01603116637680222257105633834906202862207552326555765415626315019372340702623784053903924231637804563234138106526760567e+2");
yield return new("random-032", 5.407864610999338e+99, -2.4283361152821613e+83, "2.29643778509889458747302505335422838558381481727370436095565116735296595978769610585092886289786183920833930101677046710e+2");
yield return new("random-033", 0.0002288110245806794, 0.0, "-8.38261411526334375393535692123751590799132908549380563040508715609878897233235092649069037679550173884018570482174257491e+0");
yield return new("random-034", 6.95198387660536e-176, 0.0, "-4.03315949298237128072542465580280516626518925497031864830602824684187009764700883847711984762906785572202034717206775923e+2");
yield return new("random-035", 9.43766505830237e-299, -2.65249474e-315, "-6.86228234201176014962543383119849557100354613859743367030249360927717967965898623764656915417127045516597857199147858900e+2");
yield return new("random-036", 3.2926281551971244e+27, 137438953472.0, "6.33614835880874628546675620018709051548201136684608274408383095106245336586631887659697376051244345340947423072491730227e+1");
yield return new("random-037", 2431372078.1779017, -1.1920928955078125e-07, "2.16117215761744662639878102197395800366287725931503614282577334008121605423285048128582432333806629752988014108174567834e+1");
yield return new("random-038", 2.7155404530624414e+55, 1.361129467683754e+39, "1.27641171110149671761135880871915529683251058010528817605512679810691144790955248795491903151877414696421840016126090514e+2");
yield return new("random-039", 1.287883635736426e+222, 0.0, "5.11426890923353820121101207443664755461599235605591763119757309687787478735360985374480184195705371268395707782735892440e+2");
yield return new("random-040", 1.8900609548104285e-244, 8.129872718476162e-261, "-5.61194153610773206419852279455813012236817683969635566805802218778697323324764912530529924027666137771431114589287141932e+2");
yield return new("random-041", 6.656382142195697e-270, 0.0, "-6.19802398993331042027768403245471894147579610638061238513140203456034558148614456557149021761715516142501841791372277145e+2");
yield return new("random-042", 9.37754125167402e+165, -4.0917382598701773e+149, "3.82164857945987261507740719312486582206924951643568964457550331084530234166863654242920300227719827902235895042331211458e+2");
yield return new("random-043", 2.2605984890052485e+294, -7.090649168385425e+277, "6.77775646936619405396223295861428711944170524432573400504239874690211959669345971543254935515459020496137424256799209437e+2");
yield return new("random-044", 2.0203887880077537e-185, 0.0, "-4.25274952241694410494792754883331359264069118190137356721495486883273981536244137708072284222192938988925634149041196141e+2");
yield return new("random-045", 1.6488957771278402e+229, 0.0, "5.27792092133534158039255564058282016617348553501988462964942412994818558739955990655125192127599538477288085656764416810e+2");
yield return new("random-046", 3.7214269581363095e-242, 1.0406237079649487e-258, "-5.55911485318929322306553849924276829181835961049141604781820005529818148405552679044460423424892230303334593770724677362e+2");
yield return new("random-047", 1.4469744271793996e+305, 0.0, "7.02657928137684298283399961878329635682225607860518452901331715456528527864872026777518158306664933243454291678772576453e+2");
yield return new("random-048", 1.9219673958980617e+225, 8.218962346169334e+208, "5.18734995270431853449880245948890952056910910968777167770600226396920860122245198670071717561928180426935279497242069563e+2");
yield return new("random-049", 5.973904436226128e+44, 1.9807040628566084e+28, "1.03101144814789673596316548343170103363480183917921469604882001848586354557524341894701673127893776896143813158235957600e+2");
yield return new("random-050", 1.4920692516321448e-05, 4.235164736271502e-22, "-1.11127615489627700299291224267366903978933963654499972815374755426677784782848228715571224165927990809537784273847258630e+1");
yield return new("random-051", 1.8450480598073628e+86, 6.901746346790564e+69, "1.98634823323317235925212985649293930754341320514299200103381810389265997382650464055928043016522833496913895213449183464e+2");
yield return new("random-052", 1.3925027817077125e-07, -6.617444900424222e-24, "-1.57869929605053129093490894604426811846293862255431006401507128285069534242124726161257172882950336874917349546416070662e+1");
yield return new("random-053", 1.8296348740064743e+143, 5.415370496329717e+126, "3.29873784722693786483541888457572708873969191804968574025662454337931616917923943155800023250321634990486867733899971115e+2");
yield return new("random-054", 5.843221179658271e+264, 2.2374143686308563e+248, "6.09647746767067643363517835932439451869566898556921910907220992006190267693954604214478331661075512788526277734394346935e+2");
yield return new("random-055", 9529924061.13288, 4.76837158203125e-07, "2.29777025861791874231979072253016206655978902704496083603076930130852958202339505656902603987186022433539720186781257236e+1");
yield return new("random-056", 4.8265927399886155e-163, -1.542348713665846e-179, "-3.73747229376157982857937429344336980950499597278238720924371153322219556495184657427836233747735623270022890424634008658e+2");
yield return new("random-057", 2.1495169500621713e-77, 0.0, "-1.76533809018034705752220434516799236679843902914837895254964535265449945869491922118289523531708141786221442797813374420e+2");
yield return new("random-058", 3.9652129204506115e+68, 1.1972621413014757e+52, "1.57953345877227669015582418056659048337793979324600191142273739519448872165932905149902725218843571061595383765207279665e+2");
yield return new("random-059", 2.916612265e-314, 0.0, "-7.21941296440534681101081251638640118543152953579217883687793786615868646334767313334289723269706895215614274380713785662e+2");
yield return new("random-060", 1.149855688534609e-179, 0.0, "-4.12023095199664100334422099379789460897189451208843906961052643172779908368967931438906870752996851700228094242712236965e+2");
yield return new("random-061", 2.386732868521846e+300, 0.0, "6.91645453328340930215001545205233522533901001600035099756976867351760640089382406333164993634100365461056264549845075807e+2");
yield return new("random-062", 1.3151139231461052e-39, 4.078315292499078e-56, "-8.95268953313193422038283377522572005124513782383605081619370802635937697512254853245737317233020766129677414258171722553e+1");
yield return new("random-063", 6.517526712726383e-202, 0.0, "-4.63247693819364628949075808532101213086237969027698143592210859901183658517751073405038377600910395034171199661815308407e+2");
yield return new("random-064", 3.649542073574601e+128, 0.0, "2.96025493603666942254886254110105843947594536870045753646364403236131581868029063831748416905012775304801564314200242985e+2");
yield return new("random-065", 4.864815859155447, -2.220446049250313e-16, "1.58202886479942418068537905693222155706392584393307216820994212454092314443203726644593289807682484102970711590825231036e+0");
yield return new("random-066", 1.363175836614944e-153, -6.624337284222476e-170, "-3.51985702076641037701126984801531260467784035219017100229813243648747354884078363974998010618730080529542760531181170175e+2");
yield return new("random-067", 2.7352660866513753e-257, -9.242595204427927e-274, "-5.90758140178876051325333282929122936339018493595573573928219895641486358956336985433691990140113962025657664213457757472e+2");
yield return new("random-068", 2.1730662642441385e-29, 7.006492321624085e-46, "-6.59988285016580408775399658091955081889549095831543732880410536955992307041598030904782532931638016807239392298212823072e+1");
yield return new("random-069", 1.1475900033869986e-135, -3.818670454374506e-152, "-3.10711323459995233156214305863245104720395700811671540820410356919992573279645412368739368613445281096114277259005552550e+2");
yield return new("random-070", 1.7610849300368026e-43, 0.0, "-9.84452289420925569913315558080176585009564014337537489670776161645315424514809265790196467944397562207558600252750648025e+1");
yield return new("random-071", 2.849960514758649e+302, -9.516908214257812e+285, "6.96428003223915732166211527179859476101223706635428975578059636360232894351308344412807068387499899759939951318373322311e+2");
yield return new("random-072", 2.1719583055896643e-305, 6.3e-322, "-7.01512824157618013703246000878662463665802209108757869181924294911552014159037134953257971739037837905317782987104929983e+2");
yield return new("random-073", 4.449618263670732e+181, 0.0, "4.18260720140976028261569754018246724558641242823147739394552811508198914485106490689487062356377811807297136120309730373e+2");
yield return new("random-074", 1.1535467976973781e-201, 0.0, "-4.62676762323819011478639228909447503269345566854661861006658188699812690143753483430743169733072948355660902224342302402e+2");
yield return new("random-075", 1.2704718694566384e-211, 0.0, "-4.85606066239527769215125805889719765250097224221427541511157554107498079860307791676851938723296490523392327479612899376e+2");
yield return new("random-076", 8.980024763811467e-235, 3.491753744649773e-251, "-5.38912494213627682973555614244493347475601498193783816083267485467704774881021172107674656927949877853320758702184204161e+2");
yield return new("random-077", 2.8420252662632413e-119, 1.3758210268297398e-135, "-2.72963109146345264439289861207390041654853583113486217714916341447247357071143883712505019035110293237531183642628556694e+2");
yield return new("random-078", 8.127885001046739e-206, 2.7664523314090327e-222, "-4.72237228414530641008317937964236943186269627223059078147340574012685763541779467276782070312191728061407944669788422960e+2");
yield return new("random-079", 17618175292.071636, 9.5367431640625e-07, "2.35921968931855873412435553696786911513565513946219755045198968958293324283889928351542767716997451865271245841968401311e+1");
yield return new("random-080", 2.8638991877191865e+66, 9.353610478917779e+49, "1.53022800186267166391490316995837216096916871827200883866949491980553266580421464290837281216265214983117308273590562708e+2");
yield return new("random-081", 1.8787697728320672e+63, -9.134385233318143e+46, "1.45693478045116056317481502578779070685997494214369001393106437237800218120803360446157775296641989174964123496571158869e+2");
yield return new("random-082", 1.6815576488931605e-270, -5.253807105661922e-287, "-6.21178254572575378648114145696316316201860759055939291060717971065685941222579684007465534993184416810813984770013679882e+2");
yield return new("random-083", 8570660404.85047, 2.384185791015625e-07, "2.28716106266630252506213689080352975534416138834679350670756226199980432868707090752463833170059578798066442166527283912e+1");
yield return new("random-084", 3.8759157230543322e-264, -1.101803207925311e-280, "-6.06527682599913965366746073722061614397599274388182936495291058329905877298382828816668573207259888849789923764538324356e+2");
yield return new("random-085", 5.4823526724271695e+138, 0.0, "3.19458277161792837347021289143741745184897284145512679470316961184307132793363953632751766442194058984931000117249272786e+2");
yield return new("random-086", 3.47345509037388e-296, -1.35807730622e-312, "-6.80320037724384678594106804377236149235481580633130029747070451437800819193014511886030310078143381853661208208740330888e+2");
yield return new("random-087", 7.870930971713625e+42, 3.094850098213451e+26, "9.87717502549205146836510817140363698202963571093230577261095957266542210109871173363271422176267212904596940278635560023e+1");
yield return new("random-088", 6.9152450453963086e+50, 2.076918743413931e+34, "1.17062983050980191607477479629177960786313297092612379012133432402620636204290474345742282223033400038595380132152234377e+2");
yield return new("random-089", 4.997240010529393e+278, -1.5744403932561435e+262, "6.41727541614477753470568817375016375775467258350360526781273790101040689528680544720495461507249020361424271965785315160e+2");
yield return new("random-090", 3.4897843045631857e-59, -1.105429575052089e-75, "-1.34602680556194386293271126712788772927543929851527924998434172965166685287179517283346846384000967665896828984780864411e+2");
yield return new("random-091", 6.783896332535169e+80, 0.0, "1.86121359056725385312576742124678404962712771495750586877522296470575561563507938177445987449236570098838942073317700642e+2");
yield return new("random-092", 7.099417797486954e+26, -34359738368.0, "6.18272251981762945027469377697239876995029944941549237410705362539291349451050807265978499316392041740018400553687489399e+1");
yield return new("random-093", 7.070098048137947e-133, 3.910318545279494e-149, "-3.04287943020200856482384139363422413938242876493473019795019455246192474053879599342952669745191312981684405775500405106e+2");
yield return new("random-094", 5.1443869094878267e+26, -17179869184.0, "6.15051186176377620427946724455306729014322562821522023000901652093421919044154772378644009075205741070896336895389966504e+1");
yield return new("random-095", 2.292137268437661e-57, 0.0, "-1.30417865613358152269884087575716157979349130979079930009759115796494341948675802640252511408854229429268728336421968163e+2");
yield return new("random-096", 5.592548258380238e-189, 1.9934389902195135e-205, "-4.33467147532404954158833202426454606971708818785191400918356390387861973845379635128778355451243556298719414338050380833e+2");
yield return new("random-097", 1.3513814357447103e+131, 4.92525077454931e+114, "3.01939774537207187186185486687570498016469607441013914141802233926620103461511311800339211161030937546884387376173038536e+2");
yield return new("random-098", 2.6531333161099647e-29, 0.0, "-6.57992263718562537929556336440090338757338736334813212108162511978053647749110312827800219612548321999639078969314161181e+1");
yield return new("random-099", 4.157301664867412e+21, 131072.0, "4.97791531784383018522175436350825672619258173228282968566364014252577653893803202121823622224264024254645153982139787290e+1");
yield return new("random-100", 4.7961221155444435e-223, 1.9196119217864076e-239, "-5.11908668038874346806005595767188617411143450427968795186977679257963076319353564483668806236838001915851394677137024737e+2");
yield return new("random-101", 4.123354259274072e+215, 1.9136262932255244e+199, "4.96472461966449069227832699721531273572814474747180630289980402350593983292067089343719350230210354100886267203328547517e+2");
yield return new("random-102", 3.7384188903135095e+148, -1.4196068833898572e+132, "3.42101256528557770689280049622957570295501979790517428111051450506128846347122460370946983820449914948669899389522334497e+2");
yield return new("random-103", 9.702414613162123e-291, -3.5601181736115222e-307, "-6.67779887277543716099205391820280991271469943848859733770785331564741778271064997628404284952228086271686664787432430986e+2");
yield return new("random-104", 2.1043684456742285e+279, -6.297761573024574e+262, "6.43165256341648376006704277190136757952759367172332928876842145322263419271411401909154311418904038786322403994702521229e+2");
yield return new("random-105", 3.195133224470931e-109, 1.1818212630765742e-125, "-2.49820146351590832060830480514450620828902146170205183624559306930593786517882571001894744820360754280189121011272073282e+2");
yield return new("random-106", 8.863841962010878e-218, 0.0, "-4.99781569972051496787076599345839566505382536420860662267281824201676540966764523540005682414340256908316412948792544481e+2");
yield return new("random-107", 2.245005563857926e-126, 8.200532357869981e-143, "-2.89317013717725457639179113681043748191123230906279320644571199788413106984800780420098520390195666769530596823979352542e+2");
yield return new("random-108", 1.2999788511034558e-120, 4.299440708842937e-137, "-2.76047863163332279647234322225793041932844005159176214350731988198405980754216552720506823660349354517175649368885621409e+2");
yield return new("random-109", 3.1500110778413745e+227, 1.0520271803096747e+211, "5.23834222079254767674623513438185353387012721971968098480114742506275944805738677381526057307420996120271942816871508206e+2");
yield return new("random-110", 3.548066051144377e+288, 1.352433999707303e+272, "6.64410909463003506341153971924137862406943137795518585517297744680022901269147892914111753796226269827153656893097544312e+2");
yield return new("random-111", 9.210419917079414e-32, 0.0, "-7.14623875329790608384432642162907453109567421633668844328157079051721516752456107166216269417624696456446574319358360932e+1");
yield return new("random-112", 8.254670333984976e-62, 4.3180842775472223e-78, "-1.40649496624369929073140364281264261631557925073434742929523928094489425204732198179138537249015659066733414653022367802e+2");
yield return new("random-113", 4.43004801988224e+70, -1.532495540865889e+54, "1.62669366933284030174117816962772656441156132412695817026690036710628889044428506454763102452418192173493450149007386444e+2");
yield return new("random-114", 3.799512532742202e+145, -1.3863348470604074e+129, "3.35209711261782956000388171293197980014802508236777737652895404502090555704340438069532906122061612491498971735035725527e+2");
yield return new("random-115", 9.560425597580284e+264, -4.474828737261713e+248, "6.10140096795075791618720086667425828285298925226463100182506312843285038351776891550620675982505579673702295388675289262e+2");
yield return new("random-116", 7.665250502075752e+77, -2.5711008708143844e+61, "1.79335749353619695006285975849348648679798387972410292305284265978995513039642800590561895692595899317821011741337600117e+2");
yield return new("random-117", 3.149252899902883e-70, -1.608611746708759e-86, "-1.60033791259510013069319525643028950808134325764296850296871766775053400458349837223400873131953870990037181463611054470e+2");
yield return new("random-118", 1.5191852894507272e-31, -5.473822126268817e-48, "-7.09619636854356639873001045870461502981491394812887215418562120497292779186658851347599194573773253815195340261037722749e+1");
yield return new("random-119", 7.717377021697666e-08, 0.0, "-1.63772062016773554402754617935026302460203721770051933566177110046106512593400174805544552642702527831126924468789072686e+1");
yield return new("random-120", 4.883772400847472e+229, 2.6931895815927672e+213, "5.28877904249825979792855037328931146812312124629139888313872387015013126138972729603033286873794930349078349507268098042e+2");
yield return new("random-121", 3.974372642642431e+181, 0.0, "4.18147768741822437942450584834932500724704462252990989373168744328844702968251925674967256800772274669518804418463907628e+2");
yield return new("random-122", 5.6630979411550745e-102, 1.982767060402851e-118, "-2.33129708403486465600383801629729764596505729509085309418957100573842939407706632435170062995404321386822677903560162677e+2");
yield return new("random-123", 4.481850638834303e-227, 2.3432762717119234e-243, "-5.21186780059493744370876151847719553624430189666707763270713512263578709416078516180493722032786870256068622186999608311e+2");
yield return new("random-124", 1.5587542539223835e+269, 7.33155940312959e+252, "6.19839276962466743949982685024071983522046781772916496019110114103663537932020861329286702519847926530686871402709165549e+2");
yield return new("random-125", 8.380753840046963e-246, -2.5405852245238005e-262, "-5.64309995009040962079554011719612541027095152143718379758775064827554846801779645492779393639373314728376454360262821487e+2");
yield return new("random-126", 1.8437705447129893e+222, -8.02633041618099e+205, "5.11785703328617233729840065973079704382437500616743576509308325580042186680801919402681153313725949495107782972847728726e+2");
yield return new("random-127", 7.922544673804675e-255, 0.0, "-5.85089486262062646224600779210406846799340761816921607132731939717258099439775603754191036941409495905024169809055566735e+2");
yield return new("random-128", 6.424554677747834e+139, 2.6442238751609944e+123, "3.21919455243695157040610289745193120417784170696664849006479914321508092161621052807927253728978907258639831607750307995e+2");
yield return new("random-129", 5.831050983654325e-57, 0.0, "-1.29484153044906361635653602075982888226341623099050078571435636411161885245623471077360841130068005529432826536655035430e+2");
yield return new("random-130", 2.4769148697304458e-206, 0.0, "-4.73425515375152938061831829100752402653634506213981875035566879569026161633660163789337916256902561883214753777161439214e+2");
yield return new("random-131", 2.523970736682053e+109, 0.0, "2.51907608486938191853189097281673251738753839040604280451923685623425988669394828906836465399173266727174962216214397910e+2");
yield return new("random-132", 2.0264505486449213e+38, 9.44473296573929e+21, "8.82045192982157712202265380429819920975628322885149496815771878256472601542293907276957300064237758012003909456110130657e+1");
yield return new("random-133", 1.413923080511229e+114, 0.0, "2.62841068768809026443413491439227778941112835114138477857782860081635565935714919562086197268878902414873692726030079484e+2");
yield return new("random-134", 2.66751372207705e+236, -1.129605583483287e+220, "5.44391228794946661749508217380052586433820058644633583058966875086476670472387930418354741721847524574100476270216509761e+2");
yield return new("random-135", 2.894253708613619e-246, 0.0, "-5.65373205585059422883301576809748118702659686395236194290073905001700862305042301258143573124275376457478409532047109036e+2");
yield return new("random-136", 3.5272336085475214e+233, 1.1031304526203975e+217, "5.37762840551021764349532229063144623685735530336318514096747791647776999360249487122217999288033563051204289365758709592e+2");
yield return new("random-137", 1.9179024714157584e-48, -7.596454196607839e-65, "-1.09872852337651250004567889304476851140950834459419786330012217962145673732461400057552158471307588259450382160340717683e+2");
yield return new("random-138", 2.350754518325833e+32, 0.0, "7.45374593240610784444439089156329702679937921295772915741589850873435797179448172087390360239655618098990240934086921273e+1");
yield return new("random-139", 1.5646120376652417e-207, 0.0, "-4.76187476355762876194828979996664346249023872178894958055842066957720371261912131629003742245132082495890340965036065729e+2");
yield return new("random-140", 9.029025315492739e+178, -3.599131035634557e+162, "4.12060590976059609302672010017914405171450943881387189639486900109720622819776641694075985950994400567935437050579677278e+2");
yield return new("random-141", 8.071463194163102e+36, 2.9514790517935283e+20, "8.49813981264158577303679659277698320219020489218087581292958700965522891238466832146892901176132091733145399399104786317e+1");
yield return new("random-142", 3.9019856834958817e-90, 1.0900377190420866e-106, "-2.05871172796286867634025871486849766575020212364494840217478301030320882728399940276112796041565799357504165122468368517e+2");
yield return new("random-143", 1.770391321694749e-288, -9.113902524445497e-305, "-6.62573306174432013859750859673762509268639771247347358014598503485960561604820036866417940859213609411813734815970822369e+2");
yield return new("random-144", 3.9733945721298164e-292, 0.0, "-6.70975226368962237002930828245496969242444051028431071011818389708042275938783666509863573174760273871127417885920852699e+2");
yield return new("random-145", 2.0146668330785297e+145, 0.0, "3.34575292322479200963995520400050936555259085291245342942806688577925796464132406686116890399802571987263849266197341788e+2");
yield return new("random-146", 8.437895253914177e-80, 3.745341083753759e-96, "-1.82074074539513848032242643492936684699971554986998127257786106802362104324222586359066138019573507721774402082936323917e+2");
yield return new("random-147", 6.8648474123003e-310, 0.0, "-7.11874965016085794586622912051398536893668542618916747129767015994195971916418974536201942871245422342451519738896624649e+2");
yield return new("random-148", 2.1724790429919783e+59, 1.1150372599265312e+43, "1.36628389418265666735165725148908744430133835963566024326178268374833375362997636927931675731887577684296130824432234314e+2");
yield return new("random-149", 8.932905676175932e-259, 2.8883110013837273e-275, "-5.94179797359824893296200310684732481227617382183662284427935067049141029897318335035200801444579406012282327238429480004e+2");
yield return new("random-150", 1.1268379215967158e+104, -3.978585891278293e+87, "2.39588265082073727266403464656501260679248805468733352714658650042107904975810387061520003838104004524626146337666238002e+2");
yield return new("random-151", 3.188256885857843e+249, 0.0, "5.74503162492200863323944479108167016462674063703029364493942633668009205133312704270426275517227895502923902973378710539e+2");
yield return new("random-152", 2.9305939421316244e-193, 0.0, "-4.43323717834739735918298440233056960220744118857304016614231928669605359658263157969145159493634991231390387990481504143e+2");
yield return new("random-153", 8.752813655832842e+22, 4194304.0, "5.28262472552155880611047814488985242939697499622298842908620194480759558575237561979695416349699722345028448063915554582e+1");
yield return new("random-154", 1.4814390899393957e-25, -5.739718509874451e-42, "-5.71716133514418394663986931612446322442322743063791327772105598315101825336352709475985414191345147069818906524302808915e+1");
yield return new("random-155", 1.7106573980544852e+195, -6.483618076376552e+178, "4.49540970873780799603145740698779158491953559120669563692594688264739523658295164191953486238564247004401746401632384425e+2");
yield return new("random-156", 5.153858417249538e-14, 1.5777218104420236e-30, "-3.05964456605237128203160289086211016726537586464548288686526607349187019492038387842866301503796465171235039341698517870e+1");
yield return new("random-157", 4.372119645459035e+156, -1.9053641054174757e+140, "3.60678522443309924392388181904724031875501666584729126079015543533939357613095691616333401092869089457667706194912028948e+2");
yield return new("random-158", 9.914041924112557e+184, -3.7739624248215414e+168, "4.25969609239272599720853346734795087944158090702104001003997945516455100625022237959984158070128925273475888565962060132e+2");
yield return new("random-159", 5.606906299629542e+119, 0.0, "2.75731625171973475703333381638795400404430830076063437217649779488585204180138994011567746828799588493334915846557110033e+2");
yield return new("random-160", 1.5112081611468783e+31, -562949953421312.0, "7.17930473204472871745571958806843787176388269327075294302838333074798886974919032153956983087232633035935412937503873893e+1");
yield return new("random-161", 4.354399853295316e+16, -2.0, "3.83125482823514472270526733200066300402613207287377548118632597269282248179068925250593908132497062066993237868678727297e+1");
yield return new("random-162", 5.479035260384893e+104, 1.5914343565113173e+88, "2.41169778709467497728388170273152086105463476112627962148046822181949759064575911409360211800073516991299346250565418151e+2");
yield return new("random-163", 5.422643258176727e+283, -2.0636505122486924e+267, "6.53322164699896776443819821682633922846921624095374683428135926495052350952814692257584819308179648440973174557661274719e+2");
yield return new("random-164", 2.4995884576671274e+116, 0.0, "2.68015996888699450884476324772334007904992785375271467775737851057191753907843897361473672688342628606192066385381867122e+2");
yield return new("random-165", 5.432389516420413e-158, -2.0215873059760975e-174, "-3.62116065597637983167554114293819324259130826839434249947370344730009639121266782851148283693439909329604338274391636045e+2");
yield return new("random-166", 2.1701706627254098e-215, 6.441148769597133e-232, "-4.94280989182842681659748029227029004798486056182150914921574436713501961095435809581743575881672365921867566279729384604e+2");
yield return new("random-167", 1.83829988166e-312, 0.0, "-7.17797707847009041571714048895936178519876680080541117216692654161407519939181011573994170934574468359346094774207371714e+2");
yield return new("random-168", 3.2222335501608463e-272, -1.6418147205193505e-288, "-6.25133070526169191842152906068129941304357930047910057227413954830318149274928868053773979409076693871529574204942239512e+2");
yield return new("random-169", 1.76461646544354e-106, 6.05092486695206e-123, "-2.43506086490628643856870082982279265439862246588626114956597161213161143057729130704171105293940780035945062299937077083e+2");
yield return new("random-170", 5.221690571495491e+198, 0.0, "4.57564669626554046951727117381512861863257951043552381376504777150415340673491687915069756531402262478693244164600599846e+2");
yield return new("random-171", 1.9623379565597327e-196, -5.940911144672375e-213, "-4.50632541629473478684978638448756098199302459104345407598778344850786528987252331234712223677580071612157584739568742819e+2");
yield return new("random-172", 6.073138765385226e+164, -2.557336412418861e+148, "3.79427830817239092835206565168751656809449991933636558214075651136278311590654785983725994093594755735303765504932627509e+2");
yield return new("random-173", 537900565.9322406, -2.9802322387695312e-08, "2.01031842793571405621739125882948575101002590500703732683815899001695318624319036518621476994885167724662096574869735299e+1");
yield return new("random-174", 5.428752530419509e+101, 0.0, "2.34252803763379976880250995933254613070296574508956082198710048726871808003613678586187939049343888993501480807946073386e+2");
yield return new("random-175", 1.0212120167421836e-160, 0.0, "-3.68392624705455417821848803166832987331711933711241645217377778347959381289537302338065831510789767921123080111765427737e+2");
yield return new("random-176", 4.831579909682862e+244, -1.516130949512411e+228, "5.63405936208178965570765969509370167215458089136296531280860830915157457650079361175274501605671082796874193783145313302e+2");
yield return new("random-177", 2.828255467099936e-230, -1.1441778670468376e-246, "-5.28554911309775165113920255771189157455872777570906721305730592184870228666760525592696880038296658231563255452035186321e+2");
yield return new("random-178", 4.844358976145033e+172, 1.7161994150326524e+156, "3.97622450925300126116020448521886552802234631641112800289895707076966966222873012578388755785639637291929201821806781282e+2");
yield return new("random-179", 2.6563406292248262e+190, -9.893216058924181e+173, "4.38468117141214803522350042780739884325604825907556242674957036745723498707735407212886331329477773823736596720450004280e+2");
yield return new("random-180", 2.0739167866821603e+284, -8.25460204899477e+267, "6.54663605397171646113224277491390909096577051996669939276571690842459222678633208700671964148681065860836216087443225910e+2");
yield return new("random-181", 8.414842261845763e-155, -4.140210802639048e-171, "-3.54770692331488696402354115630846130949591672846636729580484810188719636482301048672372598963118595740296213441609437042e+2");
yield return new("random-182", 2.5145133926699065e+93, 1.157920892373162e+77, "2.15062492951238088001754838808093059201117194573817803555642384823440088598790766665629613744074943621347215190016100580e+2");
yield return new("random-183", 2.778618547781905e+26, -8589934592.0, "6.08891662967811517717256314365980453862697983479252851216745059614339620310206140257358355844582016544214540511648078099e+1");
yield return new("random-184", 3.683461658530071e-59, 0.0, "-1.34548667508539992993885418640365582888632140756818369002134450098101460705971913896499380106183355186851956294299981974e+2");
yield return new("random-185", 3.245859271164568e+53, 0.0, "1.23214390042297419237723804757536646965208007453303097193637511933164327619179703891375174930308701706029327015537815851e+2");
yield return new("random-186", 4.888717960757026e-295, 0.0, "-6.77675672339845066497980244646774621837482154669290777658188864815629163780856010254389402932625433409620966950794508097e+2");
yield return new("random-187", 1.2676670279863156e+149, -5.678427533559429e+132, "3.43322357081418112003091693357593824624572733398810589443050445899849010659171506395389239926315022287983498334095625265e+2");
yield return new("random-188", 3.911029072247335e-147, 1.3892242184281734e-163, "-3.37116208140922731460220189076490802951772675127237314438114220553668114528584274672245085948840192153518337473334196063e+2");
yield return new("random-189", 7.211109058770227e-239, -2.131197353912215e-255, "-5.48342214463811269022893517877667702695851865395631474861837372360566529847741018102276529742810255530709788324617518018e+2");
yield return new("random-190", 2.6020950689735322e+100, 0.0, "2.31214826215711950526050976513396597870363927203506922159241143344765480790740718147876437537973112854188809768472027472e+2");
yield return new("random-191", 1.5063590763830884e-268, 6.72487309524726e-285, "-6.16683109390913324416993622903702189427328139639903849685412969303220084247676611200138397543215791946052466397687599725e+2");
yield return new("random-192", 6.4774111424101085e-201, -1.8130221999122236e-217, "-4.60951282776326571486754361807843918170687088700902724532535367206477009057223573998856182495732991219408647672664000502e+2");
yield return new("random-193", 3.564855867574092e-135, -1.5274681817498023e-151, "-3.09577863931000206217135490127201269212982115085566784324219557596547076280530266284867753337648450605525177965490927169e+2");
yield return new("random-194", 4.469742883936088e-05, 1.6940658945086007e-21, "-1.00155945783713507477655601997995721078164866377973465526464859641717304322097850695600439601144769010803852748494573754e+1");
yield return new("random-195", 3.45447003858828, 1.1102230246251565e-16, "1.23966905575474530154892293991639532961666212457380805811961986484602483633724130236769753546390724770503620032658732405e+0");
yield return new("random-196", 6.389551135945008e-221, -2.457103259886602e-237, "-5.07016641530527971332591352425537702993775366647079497636483058501162041214914238389087729590428124473459260440211711499e+2");
yield return new("random-197", 8.925210625023812e+18, 256.0, "4.36354116007225065290620145705693976611700006816179589867954898815380745108306268724831612850108672437446106913251777714e+1");
yield return new("random-198", 5.338056433890513e+270, 0.0, "6.23372836731422663127177695374721429236835974459921895413111368833428571774441193587466883714336922021173127848657810202e+2");
yield return new("random-199", 1.3437730625250732e+60, -4.460149039706125e+43, "1.38450586955198654374544438547355666842289680966992428327921470951044415210347049444786637636632099103936838648618750909e+2");
yield return new("random-200", 4.310308441274614e+62, 2.283596308329536e+46, "1.44221285231286739229138133706562425354001291485859165804004888105885891442917445593048122010426771144499018483486696571e+2");
yield return new("random-201", 3.45701795554779e+292, 1.1079139325602226e+276, "6.73595253509155458346545811067114469913122116895248291942282487691085668540843159590107912488573785656396640606783103216e+2");
yield return new("random-202", 1.8036263255543733e+47, 0.0, "1.08811298634294170598289858793428934882072307824018020038127088822945287440703782902488344760978913353119123965555592853e+2");
yield return new("random-203", 1830.4994501675505, 0.0, "7.51234413218742445102522983019830638218954655693036874690284790961663091593347686159039563498385178850575297137783408280e+0");
yield return new("random-204", 5.57506075236646e-31, -2.1895288505075267e-47, "-6.96618346682431451323630967686140705610128842213683384182532223711155194199500298975450824485522443400429503781681025354e+1");
yield return new("random-205", 6.556663307880683e+239, 0.0, "5.52198319057039286871905253174136312663940185427443351907861173670104317989193414411036991136763307393554856830722067250e+2");
yield return new("random-206", 5.069577386987781e+106, 0.0, "2.45697277315873949415080759501594649955055452162401628022144942505292871163631420478062694376023775920163507469347177753e+2");
yield return new("random-207", 1.044537085529022e+94, 4.631683569492648e+77, "2.16486572548357283100234618238120881111548593751461699788859579234818997872783856583367851158841910417500032038081269976e+2");
yield return new("random-208", 2.2305846672804287e+270, 1.1730495045007344e+254, "6.22500238842137464397991734042732855250327696969019206178470607991139989902965587963308363026008780425571931759271687190e+2");
yield return new("random-209", 0.00018016585556213655, -6.776263578034403e-21, "-8.62163271153104447227129793988338362809973631267988176961274416922619747467941646855879698486991040583312805022993872765e+0");
yield return new("random-210", 3.498124764484825e+240, 1.8507457879790174e+224, "5.53872649361908331322345920053132103290347143642396937721530859180851299008502220882574070554789578717289482360173296547e+2");
yield return new("random-211", 4.368427953412102e+115, -2.187250724783012e+99, "2.66271688902640909609723417657932846886534824298816386977368395849482579426639906685083603077869454661285266369936294926e+2");
yield return new("random-212", 2.4052332643208744e-89, 0.0, "-2.04052426386214092284965821604279949884342667954944306816068348358471165141980357909412884638945059797052587919774067436e+2");
yield return new("random-213", 3.0195933465008714e+137, 1.0328999512347634e+121, "3.16559279909027911071002732279205076508652046075682211850341264702076329693228046854014007936379632539249549521712243704e+2");
yield return new("random-214", 2.3140246548039862e-117, 8.805254571710335e-134, "-2.68563467596962869984683130207287862174906972407687485328936653550192111788943722592388299643467378705110165060568372167e+2");
yield return new("random-215", 4.84842743374524e+205, 2.2277542078233375e+189, "4.73608598475686553163585207474076339278278875103219671467388764005443165371546250280644220697222193864688849699780578649e+2");
yield return new("random-216", 2.552279557282328e+132, -7.880401239278896e+115, "3.04878219179086652140146591217999079377272473871661401737959928142928078348305427843032453275689564195418478279509537312e+2");
yield return new("random-217", 8.421358143452693e+226, 0.0, "5.22515002131598631969607509406575270762752250086176134323194627915475880341158566655680583384832008855755831569221433324e+2");
yield return new("random-218", 8.564040927814486e-95, 3.326531125006368e-111, "-2.16598011684664786843966823944070707112968211510328276245474842164693759228582252975790553913211034852203015713816554543e+2");
yield return new("random-219", 2.32246524862013e-37, 0.0, "-8.43530192121049913934077767807739151081520738995319271971298243739927731197096123482443357228628762600133869438357726720e+1");
yield return new("random-220", 1.2002655924723922e-144, 0.0, "-3.31389710531777517519025986502343390420101699223162578948050896122561521194475726750590074740400433600523070054865920370e+2");
yield return new("random-221", 1.1501420539934765e+234, 4.41252181048159e+217, "5.38944797220564956758596427611301481152261833859370736118621284347474682503474190956162730633608209631510843772085315986e+2");
yield return new("random-222", 1.263479078195173e+255, 5.209386275687386e+238, "5.87393067802579801739652842409142465659556372560939873998132835117430974286074294073596994917939610358945732152144695016e+2");
yield return new("random-223", 3.7694214260134175e+264, -1.1187071843154282e+248, "6.09209386072209626392207361573106927438535961045581451787517274636713469706124050743318533302352467580818805807462434442e+2");
yield return new("random-224", 1.589148e-317, 0.0, "-7.29456276567599906979759145536640727668852552717563873539768676887260723021279753876417429816085381694717030602619152942e+2");
yield return new("random-225", 2945.255915612429, -1.1368683772161603e-13, "7.98795099065062830964670499624034039528862329869928266977980123847747370860117035341311433313377668602428956051223447704e+0");
yield return new("random-226", 6.1149880519337656e-279, 0.0, "-6.40610498130096242553736039712734166690568396016211629705688693137484344106311176263084547665199679163749015710242552708e+2");
yield return new("random-227", 1.1104388458705023e+281, 0.0, "6.47131166425158328584493101805494815827299336059900922081053090928948313238124956834868198490411050953044550163555604975e+2");
yield return new("random-228", 1.007053842185e-312, 0.0, "-7.18399519933925694534894512644762662472010729552957626448833213971978445088068816040537213752831463902482017289596271222e+2");
yield return new("random-229", 827292480252520.4, -0.03125, "3.43491794125783838894014038572234193052261495595460107766760747507686686956283658186741673898255395579797074535049735357e+1");
yield return new("random-230", 7.135385626131448e-65, -2.1084395886461046e-81, "-1.47702964748034438275712600697614263427431360433755702768675433147504507210351060023531890562990207602934156575381881772e+2");
yield return new("random-231", 5.121421223663858e-34, 0.0, "-7.66544611785182522574727660804715447746356514616523650109528072127590605917801029518714206854328974214053040044999717981e+1");
yield return new("random-232", 6.793404329658736e-220, 1.9656826079092814e-236, "-5.04652768268736140007858571392571945261460963865172181897683855351829881863949050397625172734807704707357686658142450628e+2");
yield return new("random-233", 2.796115816301423e+200, -8.498207885068274e+183, "4.61545249844462106133909291851423559512429618189586360466810825754281108028172094574864149912561346430703559516952059230e+2");
yield return new("random-234", 1.0178673324195133e+27, -34359738368.0, "6.21875070986866449677783684907857931007053523072136862454811407677644620032122232036020659559994864376869299179756533993e+1");
yield return new("random-235", 2.3462080874787234e+197, 0.0, "4.54462063764964809499874307904129207088064575062979318659471122295028378946799920219473798094118812600241161550941757856e+2");
yield return new("random-236", 2.427877674294048e-111, -9.232978617785736e-128, "-2.54699927831673745564508742130746020787001604669593445438601470058329425467185202551541214771851025397448506936546976600e+2");
yield return new("random-237", 2.873528070911688e-302, 1.295163e-318, "-6.94325157516391669562377864731414291167825388563071935037505582731527421258615953633013028215883596430073198831022331839e+2");
yield return new("random-238", 4.809658830160027e+298, 2.323463919496536e+282, "6.87740983864547023659877763043081521156598892985787330254399734385598091458812000161076059179505421874849356796008361604e+2");
yield return new("random-239", 1.5174226733893404e+99, -6.070840288205404e+82, "2.28372937492483372463805866109686985668581442901876362249881516227175387653051468721984487129200546339518728577547308406e+2");
yield return new("random-240", 2.8767747485590988e-205, -1.1065809325636131e-221, "-4.70973274276137053511347547039400506634741641391840518911609650132064863758884649616645681364939249651368575972231601302e+2");
yield return new("random-241", 6.385056881328112e-165, 0.0, "-3.78072579945985698128588628634522465084204080379676174222175746765407616638775806735073053417864141718494460434315905213e+2");
yield return new("random-242", 3.9005770726372804e+224, 0.0, "5.17140185340198638866745098142924604517967107033905134072414680481554085656711266551625213968904821723624797093610133019e+2");
yield return new("random-243", 5.1722291955410205e+246, 0.0, "5.68079236651146088036319981468013324509722642360698752269752715213959238918749551151441899347847805117316983816636693267e+2");
yield return new("random-244", 4.298998303640836e+154, -1.488565707357403e+138, "3.56056486364003204726343244207252520429349325191165239282510856135655261004235396158011137467461235418577644504504222387e+2");
yield return new("random-245", 1.5185626524476913e+61, 7.1362384635298e+44, "1.40875454936721437499893989231190374885140428403552041520960903402286814846194270280799756712919535860628116694335428996e+2");
yield return new("random-246", 4.085668035448621e+205, 2.2277542078233375e+189, "4.73437429312490694386049271175826682620319641177076148062968896318631158922770042657373872246399506055522444780724306571e+2");
yield return new("random-247", 1.5420238001729004e+283, 5.159126280621731e+266, "6.52064677026949729816884065216128821962993497714966831193777464364063760666838212466336507053566687990392938798492458245e+2");
yield return new("random-248", 5.336849138332707e+81, 2.1062458333711437e+65, "1.88184027962341019077714848296459388586506121524745930973946037106363228987392423689255254324763195858209755573712080049e+2");
yield return new("random-249", 8.386586153785071e-113, 0.0, "-2.58065481965314232250607363736420449457733212264668440460665977821328825375146429747227124069764815027098822707024455128e+2");
yield return new("random-250", 7.634703466117984e+205, 0.0, "4.74062648162942342292299900654742322626807477869562056102457486778118050096860644731167418280509270009323360536859365672e+2");
yield return new("random-251", 1.0697583884158305e-268, 0.0, "-6.17025372104647115331333897195733076935986800108352365744634990546595589726879852131903327733185704119630529589085846030e+2");
yield return new("random-252", 4.2339435458230855e+160, 0.0, "3.69856748718138517414222465894015769642337381860073101240319370144380441097510985600450576066244093204177326829768439030e+2");
yield return new("random-253", 8.675903970376017e-149, -4.341325682588042e-165, "-3.40924629331630824836495518776096664810339464207534713562093700342049471833142404236106179783832027136779706294358111827e+2");
yield return new("random-254", 1.346822566042448e+124, 5.871356456934583e+107, "2.85818299694729351666140369388148758006538514538351205382694411108615803449309089883404949404055575161202490431678968923e+2");
yield return new("random-255", 9.231105715754348e+192, 0.0, "4.44318916692052957298082700572980820587849802004826278451568102269006225410536617052586906226436322300366945249615707276e+2");
}
}
@@ -0,0 +1,549 @@
// Generated by generate_real_pow.py; do not hand-edit reference literals.
// Exact binary64 sums; Decimal ln/exp at 450/650 digits, rounded to 120 digits.
// Reference uncertainty is explicitly allowed as 2^-350 relative in the tests.
using Xunit;
namespace Just.PreciseMath.Tests.ReferenceData;
internal static class RealPowReferenceData
{
public static IEnumerable<TheoryDataRow<string, double, double, double, double, bool, string>> Cases()
{
yield return new("magnitude-fractional", 0.125, 0.0, 0.5, 0.0, false, "3.53553390593273762200422181052424519642417968844237018294169934497683119615526759712596883581910393183753461557728074256e-1");
yield return new("magnitude-fractional", 0.125, 0.0, 0.5, 0.0, true, "3.53553390593273762200422181052424519642417968844237018294169934497683119615526759712596883581910393183753461557728074256e-1");
yield return new("magnitude-fractional", 0.125, 0.0, -0.5, 0.0, false, "2.82842712474619009760337744841939615713934375075389614635335947598146495692421407770077506865528314547002769246182459405e+0");
yield return new("magnitude-fractional", 0.125, 0.0, -0.5, 0.0, true, "2.82842712474619009760337744841939615713934375075389614635335947598146495692421407770077506865528314547002769246182459405e+0");
yield return new("magnitude-fractional", 0.125, 0.0, 0.25, 0.0, false, "5.94603557501360533358749985280237957646486046231908706509501112359733334113458579935390672269068836858018697387384606593e-1");
yield return new("magnitude-fractional", 0.125, 0.0, 0.25, 0.0, true, "5.94603557501360533358749985280237957646486046231908706509501112359733334113458579935390672269068836858018697387384606593e-1");
yield return new("magnitude-fractional", 0.125, 0.0, -0.25, 0.0, false, "1.68179283050742908606225095246642979008006852471356902162645217194984950990780447962864800839858507234560314748703817016e+0");
yield return new("magnitude-fractional", 0.125, 0.0, -0.25, 0.0, true, "1.68179283050742908606225095246642979008006852471356902162645217194984950990780447962864800839858507234560314748703817016e+0");
yield return new("magnitude-fractional", 0.5, 0.0, 0.5, 0.0, false, "7.07106781186547524400844362104849039284835937688474036588339868995366239231053519425193767163820786367506923115456148512e-1");
yield return new("magnitude-fractional", 0.5, 0.0, 0.5, 0.0, true, "7.07106781186547524400844362104849039284835937688474036588339868995366239231053519425193767163820786367506923115456148512e-1");
yield return new("magnitude-fractional", 0.5, 0.0, -0.5, 0.0, false, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702e+0");
yield return new("magnitude-fractional", 0.5, 0.0, -0.5, 0.0, true, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702e+0");
yield return new("magnitude-fractional", 0.5, 0.0, 0.25, 0.0, false, "8.40896415253714543031125476233214895040034262356784510813226085974924754953902239814324004199292536172801573743519085080e-1");
yield return new("magnitude-fractional", 0.5, 0.0, 0.25, 0.0, true, "8.40896415253714543031125476233214895040034262356784510813226085974924754953902239814324004199292536172801573743519085080e-1");
yield return new("magnitude-fractional", 0.5, 0.0, -0.25, 0.0, false, "1.18920711500272106671749997056047591529297209246381741301900222471946666822691715987078134453813767371603739477476921319e+0");
yield return new("magnitude-fractional", 0.5, 0.0, -0.25, 0.0, true, "1.18920711500272106671749997056047591529297209246381741301900222471946666822691715987078134453813767371603739477476921319e+0");
yield return new("magnitude-fractional", 1.25, 0.0, 0.5, 0.0, false, "1.11803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475408807538689175e+0");
yield return new("magnitude-fractional", 1.25, 0.0, 0.5, 0.0, true, "1.11803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475408807538689175e+0");
yield return new("magnitude-fractional", 1.25, 0.0, -0.5, 0.0, false, "8.94427190999915878563669467492510494176247343844610289708358898164208370255121959765765763351512909987803270460309513402e-1");
yield return new("magnitude-fractional", 1.25, 0.0, -0.5, 0.0, true, "8.94427190999915878563669467492510494176247343844610289708358898164208370255121959765765763351512909987803270460309513402e-1");
yield return new("magnitude-fractional", 1.25, 0.0, 0.25, 0.0, false, "1.05737126344056411953503700002860572698107896024530290921158855421519582984251108918118589235711605941630489816077042444e+0");
yield return new("magnitude-fractional", 1.25, 0.0, 0.25, 0.0, true, "1.05737126344056411953503700002860572698107896024530290921158855421519582984251108918118589235711605941630489816077042444e+0");
yield return new("magnitude-fractional", 1.25, 0.0, -0.25, 0.0, false, "9.45741609003175813301696119887215020570196802611740261411907342262690255532065088709061922065099200150282880000281584472e-1");
yield return new("magnitude-fractional", 1.25, 0.0, -0.25, 0.0, true, "9.45741609003175813301696119887215020570196802611740261411907342262690255532065088709061922065099200150282880000281584472e-1");
yield return new("magnitude-fractional", 2.0, 0.0, 0.5, 0.0, false, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702e+0");
yield return new("magnitude-fractional", 2.0, 0.0, 0.5, 0.0, true, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702e+0");
yield return new("magnitude-fractional", 2.0, 0.0, -0.5, 0.0, false, "7.07106781186547524400844362104849039284835937688474036588339868995366239231053519425193767163820786367506923115456148512e-1");
yield return new("magnitude-fractional", 2.0, 0.0, -0.5, 0.0, true, "7.07106781186547524400844362104849039284835937688474036588339868995366239231053519425193767163820786367506923115456148512e-1");
yield return new("magnitude-fractional", 2.0, 0.0, 0.25, 0.0, false, "1.18920711500272106671749997056047591529297209246381741301900222471946666822691715987078134453813767371603739477476921319e+0");
yield return new("magnitude-fractional", 2.0, 0.0, 0.25, 0.0, true, "1.18920711500272106671749997056047591529297209246381741301900222471946666822691715987078134453813767371603739477476921319e+0");
yield return new("magnitude-fractional", 2.0, 0.0, -0.25, 0.0, false, "8.40896415253714543031125476233214895040034262356784510813226085974924754953902239814324004199292536172801573743519085080e-1");
yield return new("magnitude-fractional", 2.0, 0.0, -0.25, 0.0, true, "8.40896415253714543031125476233214895040034262356784510813226085974924754953902239814324004199292536172801573743519085080e-1");
yield return new("magnitude-fractional", 10.0, 0.0, 0.5, 0.0, false, "3.16227766016837933199889354443271853371955513932521682685750485279259443863923822134424810837930029518734728415284005515e+0");
yield return new("magnitude-fractional", 10.0, 0.0, 0.5, 0.0, true, "3.16227766016837933199889354443271853371955513932521682685750485279259443863923822134424810837930029518734728415284005515e+0");
yield return new("magnitude-fractional", 10.0, 0.0, -0.5, 0.0, false, "3.16227766016837933199889354443271853371955513932521682685750485279259443863923822134424810837930029518734728415284005515e-1");
yield return new("magnitude-fractional", 10.0, 0.0, -0.5, 0.0, true, "3.16227766016837933199889354443271853371955513932521682685750485279259443863923822134424810837930029518734728415284005515e-1");
yield return new("magnitude-fractional", 10.0, 0.0, 0.25, 0.0, false, "1.77827941003892280122542119519268484473579052640225535801183072277630188153949380490030039927870215508827904815953580779e+0");
yield return new("magnitude-fractional", 10.0, 0.0, 0.25, 0.0, true, "1.77827941003892280122542119519268484473579052640225535801183072277630188153949380490030039927870215508827904815953580779e+0");
yield return new("magnitude-fractional", 10.0, 0.0, -0.25, 0.0, false, "5.62341325190349080394951039776481231468251043098691664081689423735883568643062848905857984526220305928676107320100325218e-1");
yield return new("magnitude-fractional", 10.0, 0.0, -0.25, 0.0, true, "5.62341325190349080394951039776481231468251043098691664081689423735883568643062848905857984526220305928676107320100325218e-1");
yield return new("magnitude-fractional", 1e-308, 0.0, 0.5, 0.0, false, "9.99999999999999954663312668624229970027635275551902709065412883955749582023799148147816180828307038836518462277055056772e-155");
yield return new("magnitude-fractional", 1e-308, 0.0, 0.5, 0.0, true, "9.99999999999999954663312668624229970027635275551902709065412883955749582023799148147816180828307038836518462277055056772e-155");
yield return new("magnitude-fractional", 1e-308, 0.0, -0.5, 0.0, false, "1.00000000000000004533668733137577208538758290737643075222806930839565339309075717997298002237288492583083654145298106779e+154");
yield return new("magnitude-fractional", 1e-308, 0.0, -0.5, 0.0, true, "1.00000000000000004533668733137577208538758290737643075222806930839565339309075717997298002237288492583083654145298106779e+154");
yield return new("magnitude-fractional", 1e-308, 0.0, 0.25, 0.0, false, "9.99999999999999977331656334312114728086915364909915495978338849867251827386069354804974783593763012673903308351645866322e-78");
yield return new("magnitude-fractional", 1e-308, 0.0, 0.25, 0.0, true, "9.99999999999999977331656334312114728086915364909915495978338849867251827386069354804974783593763012673903308351645866322e-78");
yield return new("magnitude-fractional", 1e-308, 0.0, -0.25, 0.0, false, "1.00000000000000002266834366568788578576688918082216786934503169822053290495945819636764875306200829619210785845479431326e+77");
yield return new("magnitude-fractional", 1e-308, 0.0, -0.25, 0.0, true, "1.00000000000000002266834366568788578576688918082216786934503169822053290495945819636764875306200829619210785845479431326e+77");
yield return new("magnitude-fractional", 1e+308, 0.0, 0.5, 0.0, false, "1.00000000000000000548953181472022769363498177597378109589161168665811318694753029295146913909263900447853234927525250827e+154");
yield return new("magnitude-fractional", 1e+308, 0.0, 0.5, 0.0, true, "1.00000000000000000548953181472022769363498177597378109589161168665811318694753029295146913909263900447853234927525250827e+154");
yield return new("magnitude-fractional", 1e+308, 0.0, -0.5, 0.0, false, "9.99999999999999994510468185279772336499977768851775010266452612430354557456678261561807633749207598232489385362887447809e-155");
yield return new("magnitude-fractional", 1e+308, 0.0, -0.5, 0.0, true, "9.99999999999999994510468185279772336499977768851775010266452612430354557456678261561807633749207598232489385362887447809e-155");
yield return new("magnitude-fractional", 1e+308, 0.0, 0.25, 0.0, false, "1.00000000000000000274476590736011384305062094488369602433687160865381803822283746860825719590929513268274096591178940102e+77");
yield return new("magnitude-fractional", 1e+308, 0.0, 0.25, 0.0, true, "1.00000000000000000274476590736011384305062094488369602433687160865381803822283746860825719590929513268274096591178940102e+77");
yield return new("magnitude-fractional", 1e+308, 0.0, -0.25, 0.0, false, "9.99999999999999997255234092639886164483118941322693002202644466118298883688905501765798127653785006601604392452173303686e-78");
yield return new("magnitude-fractional", 1e+308, 0.0, -0.25, 0.0, true, "9.99999999999999997255234092639886164483118941322693002202644466118298883688905501765798127653785006601604392452173303686e-78");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, 0.5, 0.0, false, "1.34078079299425963552911713195043695469727618480058862029334370399776985359080234696399164558501564730514350304768526522e+154");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, 0.5, 0.0, true, "1.34078079299425963552911713195043695469727618480058862029334370399776985359080234696399164558501564730514350304768526522e+154");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, -0.5, 0.0, false, "7.45834073120020715731204557936772675053006294617560933561115186060543731364676921261899191715983532292812186170049979655e-155");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, -0.5, 0.0, true, "7.45834073120020715731204557936772675053006294617560933561115186060543731364676921261899191715983532292812186170049979655e-155");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, 0.25, 0.0, false, "1.15792089237316192209694896490707222964874608799567844200466962889572704321535999944925308227539057659339055339681605199e+77");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, 0.25, 0.0, true, "1.15792089237316192209694896490707222964874608799567844200466962889572704321535999944925308227539057659339055339681605199e+77");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, -0.25, 0.0, false, "8.63616855509444486508818122304097055415111538584065636011289536797300988764707973121273069940936828291643022408397584041e-78");
yield return new("magnitude-fractional", 1.7976931348623157e+308, 0.0, -0.25, 0.0, true, "8.63616855509444486508818122304097055415111538584065636011289536797300988764707973121273069940936828291643022408397584041e-78");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, 0.5, 0.0, false, "1.49166814624004134865819306309258676747529430692008137885430366664125567701402366098723497808008556067230232065116722029e-154");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, 0.5, 0.0, true, "1.49166814624004134865819306309258676747529430692008137885430366664125567701402366098723497808008556067230232065116722029e-154");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, -0.5, 0.0, false, "6.70390396497129854978701249910292306373968291029619668886178072186088201503677348840093714908345171384501592909324302543e+153");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, -0.5, 0.0, true, "6.70390396497129854978701249910292306373968291029619668886178072186088201503677348840093714908345171384501592909324302543e+153");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, 0.25, 0.0, false, "1.22133866975546195086019597071117283027094025981639387493045310083030448293378253341035004249805099426031227511728968499e-77");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, 0.25, 0.0, true, "1.22133866975546195086019597071117283027094025981639387493045310083030448293378253341035004249805099426031227511728968499e-77");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, -0.25, 0.0, false, "8.18773715074641276175512015429796283075074324712432370618218536007567547824852929155240369448016154013101539920067009834e+76");
yield return new("magnitude-fractional", 2.2250738585072014e-308, 0.0, -0.25, 0.0, true, "8.18773715074641276175512015429796283075074324712432370618218536007567547824852929155240369448016154013101539920067009834e+76");
yield return new("magnitude-fractional", 5e-324, 0.0, 0.5, 0.0, false, "2.22275874948507748344271341427056009691252456146490779348359058296867560895386883763556924176228875021979558564896467371e-162");
yield return new("magnitude-fractional", 5e-324, 0.0, 0.5, 0.0, true, "2.22275874948507748344271341427056009691252456146490779348359058296867560895386883763556924176228875021979558564896467371e-162");
yield return new("magnitude-fractional", 5e-324, 0.0, -0.5, 0.0, false, "4.49891379454319638281053850768598185886969711830191663310075557261183758067148787031904068610389085714992091063352089512e+161");
yield return new("magnitude-fractional", 5e-324, 0.0, -0.5, 0.0, true, "4.49891379454319638281053850768598185886969711830191663310075557261183758067148787031904068610389085714992091063352089512e+161");
yield return new("magnitude-fractional", 5e-324, 0.0, 0.25, 0.0, false, "1.49089193085383538923363765955953714632683137184618392935846325784949277701877750660443120422125365510292025771153525999e-81");
yield return new("magnitude-fractional", 5e-324, 0.0, 0.25, 0.0, true, "1.49089193085383538923363765955953714632683137184618392935846325784949277701877750660443120422125365510292025771153525999e-81");
yield return new("magnitude-fractional", 5e-324, 0.0, -0.25, 0.0, false, "6.70739427389146133442979443040089115095100886804424598010444624697399335178119519563972910651814833367532781502518894456e+80");
yield return new("magnitude-fractional", 5e-324, 0.0, -0.25, 0.0, true, "6.70739427389146133442979443040089115095100886804424598010444624697399335178119519563972910651814833367532781502518894456e+80");
yield return new("magnitude-fractional", 1.5e-323, 0.0, 0.5, 0.0, false, "3.84993108707641627122600290059926404237255350129666737160618209899559937423494685274791184799681874644435873403370543290e-162");
yield return new("magnitude-fractional", 1.5e-323, 0.0, 0.5, 0.0, true, "3.84993108707641627122600290059926404237255350129666737160618209899559937423494685274791184799681874644435873403370543290e-162");
yield return new("magnitude-fractional", 1.5e-323, 0.0, -0.5, 0.0, false, "2.59744909034043513148650050061494744261411269765007057832800750597691385503419414418131222592693689839234334326690354298e+161");
yield return new("magnitude-fractional", 1.5e-323, 0.0, -0.5, 0.0, true, "2.59744909034043513148650050061494744261411269765007057832800750597691385503419414418131222592693689839234334326690354298e+161");
yield return new("magnitude-fractional", 1.5e-323, 0.0, 0.25, 0.0, false, "1.96212412631729705033078154058910173357105507332164681146669468771984961762045773719486689548007756898757149986001752693e-81");
yield return new("magnitude-fractional", 1.5e-323, 0.0, 0.25, 0.0, true, "1.96212412631729705033078154058910173357105507332164681146669468771984961762045773719486689548007756898757149986001752693e-81");
yield return new("magnitude-fractional", 1.5e-323, 0.0, -0.25, 0.0, false, "5.09651752703788425957703665020926495608911454305921480449451222216463991937051260397794976885539652420438032469828508406e+80");
yield return new("magnitude-fractional", 1.5e-323, 0.0, -0.25, 0.0, true, "5.09651752703788425957703665020926495608911454305921480449451222216463991937051260397794976885539652420438032469828508406e+80");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, 0.5, 0.0, false, "1.49166814624004118304976095753067419877121763396070718594905338060863227802018538057320728267769388445010579065358732565e-154");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, 0.5, 0.0, true, "1.49166814624004118304976095753067419877121763396070718594905338060863227802018538057320728267769388445010579065358732565e-154");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, -0.5, 0.0, false, "6.70390396497129929406986617780450293424141035924807833727069092981666797634550332571529529044512005078252133277794006579e+153");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, -0.5, 0.0, true, "6.70390396497129929406986617780450293424141035924807833727069092981666797634550332571529529044512005078252133277794006579e+153");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, 0.25, 0.0, false, "1.22133866975546188306228036933245893141686363606809552923034822452809083249276724715142720468056663605153578269552119074e-77");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, 0.25, 0.0, true, "1.22133866975546188306228036933245893141686363606809552923034822452809083249276724715142720468056663605153578269552119074e-77");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, -0.25, 0.0, false, "8.18773715074641321626583537117020913511494541443896563298960534639533131600118144026836217696910989194252502981227226227e+76");
yield return new("magnitude-fractional", 2.225073858507201e-308, 0.0, -0.25, 0.0, true, "8.18773715074641321626583537117020913511494541443896563298960534639533131600118144026836217696910989194252502981227226227e+76");
yield return new("both-residuals", 0.75, -2.7755575615628914e-17, -0.75, 2.7755575615628914e-17, false, "1.24080647880279948978668774020400383162168148518365984401870568185107870123012977680643497818948881870193258426644152432e+0");
yield return new("both-residuals", 0.75, -2.7755575615628914e-17, -0.75, 2.7755575615628914e-17, true, "1.24080647880279949969425637608433508897779877922049071098745386487756831224426132630750851632781285014883560422980096941e+0");
yield return new("both-residuals", 0.75, 2.7755575615628914e-17, -0.75, -2.7755575615628914e-17, false, "1.24080647880279944072322891841795294621657944505257632925987715679870446507332555334358875090442720455152660591099716709e+0");
yield return new("both-residuals", 0.75, 2.7755575615628914e-17, -0.75, -2.7755575615628914e-17, true, "1.24080647880279943081566028253762470875134169085093098367471430643224726044961852143741493498121612968652975190136962981e+0");
yield return new("both-residuals", 1.25, -5.551115123125783e-17, -0.75, 2.7755575615628914e-17, false, "8.45897010752451329041104016431329934391244376780383201047873499378226758793865599559592532178082507092501188118981361501e-1");
yield return new("both-residuals", 1.25, -5.551115123125783e-17, -0.75, 2.7755575615628914e-17, true, "8.45897010752451323802059733991836925612746817442845701171528329987464924867233613100256215569624644095391184093269866766e-1");
yield return new("both-residuals", 1.25, 5.551115123125783e-17, -0.75, -2.7755575615628914e-17, false, "8.45897010752451262214955183614439714481697820961555234471137451915065156064483846559557956068119379575900456227011078709e-1");
yield return new("both-residuals", 1.25, 5.551115123125783e-17, -0.75, -2.7755575615628914e-17, true, "8.45897010752451267453999466053934427118966104021576000911655669569241552727459932283035609497567327677230890267980037294e-1");
yield return new("both-residuals", 2.0, -1.1102230246251565e-16, -0.75, 2.7755575615628914e-17, false, "5.94603557501360569553494844472350895673818381655018436959097223903591890842691984780924646465218884298677152802935745749e-1");
yield return new("both-residuals", 2.0, -1.1102230246251565e-16, -0.75, 2.7755575615628914e-17, true, "5.94603557501360558114095987606689599729726502404602592740428723806105955332455415316936987279118043435420754854234910602e-1");
yield return new("both-residuals", 2.0, 1.1102230246251565e-16, -0.75, -2.7755575615628914e-17, false, "5.94603557501360497164005126088126764802002984882440581606991833555884775167054806250941848111774053025833144709481521296e-1");
yield return new("both-residuals", 2.0, 1.1102230246251565e-16, -0.75, -2.7755575615628914e-17, true, "5.94603557501360508603403982953788720409318095259779104909319784997617973766115568981771202731966347979584363611092695196e-1");
yield return new("both-residuals", 10.0, -4.440892098500626e-16, -0.75, 2.7755575615628914e-17, false, "1.77827941003892297410310427470628995275711501893425056078136287204346668846817708415496935100410216697661083918512721965e-1");
yield return new("both-residuals", 10.0, -4.440892098500626e-16, -0.75, 2.7755575615628914e-17, true, "1.77827941003892286045402355245424216519575464183008135491311275464472978676352606622708670621049470515817679129638179195e-1");
yield return new("both-residuals", 10.0, 4.440892098500626e-16, -0.75, -2.7755575615628914e-17, false, "1.77827941003892262834773811567909478971830439247408606512494179191830821857064396276771203000124615157815510278308245572e-1");
yield return new("both-residuals", 10.0, 4.440892098500626e-16, -0.75, -2.7755575615628914e-17, true, "1.77827941003892274199681883793113212726289014894643747354207792840165566405891845924845779507478209165910797439711762861e-1");
yield return new("both-residuals", 1e-300, -4.144523e-317, -0.75, 2.7755575615628914e-17, false, "9.99999999999980839417205838144269488105509547852784480192283863686935450383280503756155341381028121651153201760891272353e+224");
yield return new("both-residuals", 1e-300, -4.144523e-317, -0.75, 2.7755575615628914e-17, true, "1.00000000000000001228960384281128659032403418937310393409928914018123888620755828115158599201947137601964079457117007969e+225");
yield return new("both-residuals", 1e-300, 4.144523e-317, -0.75, -2.7755575615628914e-17, false, "1.00000000000001912299415640940899886118572174993747649453987686580125827152253261907049286723596315283386965787648595945e+225");
yield return new("both-residuals", 1e-300, 4.144523e-317, -0.75, -2.7755575615628914e-17, true, "9.99999999999999950121758404375576959817317431245218586726623236700527362287366517958202668314968561369366154523006198871e+224");
yield return new("both-residuals", 1e+300, -3.717542271194458e+283, -0.75, 2.7755575615628914e-17, false, "1.00000000000001916137539484758927744644236811032418033091860054727512787942749492711146921601563284106251010827851360096e-225");
yield return new("both-residuals", 1e+300, -3.717542271194458e+283, -0.75, 2.7755575615628914e-17, true, "9.99999999999999988502996842555117395146582273826718192788513901439788033611568720051441567595436078868170796681674541210e-226");
yield return new("both-residuals", 1e+300, 3.717542271194458e+283, -0.75, -2.7755575615628914e-17, false, "9.99999999999980759867464769972763724419588071118855818685345806742657193510510999192511833495682130381763912607769829706e-226");
yield return new("both-residuals", 1e+300, 3.717542271194458e+283, -0.75, -2.7755575615628914e-17, true, "9.99999999999999932739862774638257663921712894099748348570472749928684395205463888208157089471726205544045310445938415164e-226");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, 1e+16, 0.0, false, "1.74213524347257945295652618738001317452235171833385950535253647114973638316855322270084410811627441575590109667888081038e+0");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, 1e+16, 0.0, true, "1.74213524347257945295652618738001317452235171833385950535253647114973638316855322270084410811627441575590109667888081038e+0");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, 1e+16, 0.5, false, "1.74213524347257950131049267023527908100274668323916439419942660066782609265073171767742177992391778124042932245161915266e+0");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, 1e+16, 0.5, true, "1.74213524347257945295652618738001317452235171833385950535253647114973638316855322270084410811627441575590109667888081038e+0");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, -1e+16, 0.0, false, "5.74008248640163406570323260796400350898921633013627559445094021757127884114205175777865596982713311546482256153750779035e-1");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, -1e+16, 0.0, true, "5.74008248640163406570323260796400350898921633013627559445094021757127884114205175777865596982713311546482256153750779035e-1");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, -1e+16, 0.5, false, "5.74008248640163422502252609923178029577939042099710941358427739424719881250130737422712937361785460859357868493310735417e-1");
yield return new("near-one-amplification", 1.0, 5.551115123125783e-17, -1e+16, 0.5, true, "5.74008248640163406570323260796400350898921633013627559445094021757127884114205175777865596982713311546482256153750779035e-1");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, 1e+16, 0.0, false, "5.74008248640163388882328470694567669982856575341004155963943813573817958014645596410482443338608889885813316753416261644e-1");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, 1e+16, 0.0, true, "5.74008248640163388882328470694567669982856575341004155963943813573817958014645596410482443338608889885813316753416261644e-1");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, 1e+16, 0.5, false, "5.74008248640163372950399121567790040044446299230793175147572231166653022485794686900599598146834659484055981486222307747e-1");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, 1e+16, 0.5, true, "5.74008248640163388882328470694567669982856575341004155963943813573817958014645596410482443338608889885813316753416261644e-1");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, -1e+16, 0.0, false, "1.74213524347257950664021310859903061786013301510296174575435387647993089582331445728303604236023896079653061468039839909e+0");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, -1e+16, 0.0, true, "1.74213524347257950664021310859903061786013301510296174575435387647993089582331445728303604236023896079653061468039839909e+0");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, -1e+16, 0.5, false, "1.74213524347257945828624662574376187926593335207883814581634203954203794788539972988279988717050692444535562543545488940e+0");
yield return new("near-one-amplification", 1.0, -5.551115123125783e-17, -1e+16, 0.5, true, "1.74213524347257950664021310859903061786013301510296174575435387647993089582331445728303604236023896079653061468039839909e+0");
yield return new("near-one-amplification", 1.0, 1e-300, 1e+300, 0.0, false, "2.71828182845904544620069715400795101672623231113287596107365824291457238222591209029780146832845677951309210491758547737e+0");
yield return new("near-one-amplification", 1.0, 1e-300, 1e+300, 0.0, true, "2.71828182845904544620069715400795101672623231113287596107365824291457238222591209029780146832845677951309210491758547737e+0");
yield return new("near-one-amplification", 1.0, 1e-300, 1e+300, 3.717542271194458e+283, false, "2.71828182845904554725397317717058496713671499260027656965144902140448310225064378080405816835132500569174418989369947426e+0");
yield return new("near-one-amplification", 1.0, 1e-300, 1e+300, 3.717542271194458e+283, true, "2.71828182845904544620069715400795101672623231113287596107365824291457238222591209029780146832845677951309210491758547737e+0");
yield return new("near-one-amplification", 1.0, 1e-300, -1e+300, 0.0, false, "3.67879441171442293061377208035852522456072501350014739835749179832638210744771329286321057933884000942080489146981881724e-1");
yield return new("near-one-amplification", 1.0, 1e-300, -1e+300, 0.0, true, "3.67879441171442293061377208035852522456072501350014739835749179832638210744771329286321057933884000942080489146981881724e-1");
yield return new("near-one-amplification", 1.0, 1e-300, -1e+300, 3.717542271194458e+283, false, "3.67879441171442306737450940618167686170229677690677741473462470630450457964188704817492842431616039442478016380865743440e-1");
yield return new("near-one-amplification", 1.0, 1e-300, -1e+300, 3.717542271194458e+283, true, "3.67879441171442293061377208035852522456072501350014739835749179832638210744771329286321057933884000942080489146981881724e-1");
yield return new("near-one-amplification", 1.0, -1e-300, 1e+300, 0.0, false, "3.67879441171442293061377208035852522456072501350014739835749179832638210744771329286321057933884000942080489146981881724e-1");
yield return new("near-one-amplification", 1.0, -1e-300, 1e+300, 0.0, true, "3.67879441171442293061377208035852522456072501350014739835749179832638210744771329286321057933884000942080489146981881724e-1");
yield return new("near-one-amplification", 1.0, -1e-300, 1e+300, 3.717542271194458e+283, false, "3.67879441171442279385303475453537867155737373478593659163546119087478365634236976677131937821785042990220141215143313719e-1");
yield return new("near-one-amplification", 1.0, -1e-300, 1e+300, 3.717542271194458e+283, true, "3.67879441171442293061377208035852522456072501350014739835749179832638210744771329286321057933884000942080489146981881724e-1");
yield return new("near-one-amplification", 1.0, -1e-300, -1e+300, 0.0, false, "2.71828182845904544620069715400795101672623231113287596107365824291457238222591209029780146832845677951309210491758547737e+0");
yield return new("near-one-amplification", 1.0, -1e-300, -1e+300, 0.0, true, "2.71828182845904544620069715400795101672623231113287596107365824291457238222591209029780146832845677951309210491758547737e+0");
yield return new("near-one-amplification", 1.0, -1e-300, -1e+300, 3.717542271194458e+283, false, "2.71828182845904534514742113084532082301400221755000071851653989022321014376146789040394869813578663425336994298513303853e+0");
yield return new("near-one-amplification", 1.0, -1e-300, -1e+300, 3.717542271194458e+283, true, "2.71828182845904544620069715400795101672623231113287596107365824291457238222591209029780146832845677951309210491758547737e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1e+300, 0.0, false, "1.00000001000000004999999978498051919100064916155881301934721890259653045226376562409391341474351312337410920605053466657e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1e+300, 0.0, true, "1.00000001000000004999999978498051919100064916155881301934721890259653045226376562409391341474351312337410920605053466657e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1e+300, 3.717542271194458e+283, false, "1.00000001000000005000000015673475002798867093503278454523013197787992752278936909075425824775155904527965636642808116539e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1e+300, 3.717542271194458e+283, true, "1.00000001000000004999999978498051919100064916155881301934721890259653045226376562409391341474351312337410920605053466657e+0");
yield return new("near-one-amplification", 1.0, 1e-308, -1e+300, 0.0, false, "9.99999990000000050000000215019474008609802662350038225593602994907248327116527203321468186530978828157627402416645402812e-1");
yield return new("near-one-amplification", 1.0, 1e-308, -1e+300, 0.0, true, "9.99999990000000050000000215019474008609802662350038225593602994907248327116527203321468186530978828157627402416645402812e-1");
yield return new("near-one-amplification", 1.0, 1e-308, -1e+300, 3.717542271194458e+283, false, "9.99999990000000050000000586773697410513282046909529794168284045856005481300674221463748884069533913431588194868839652610e-1");
yield return new("near-one-amplification", 1.0, 1e-308, -1e+300, 3.717542271194458e+283, true, "9.99999990000000050000000215019474008609802662350038225593602994907248327116527203321468186530978828157627402416645402812e-1");
yield return new("near-one-amplification", 1.0, 1e-308, 1.7976931348623157e+308, 0.0, false, "6.03570782819421774321978108606210701191506480312552217045440768852206169109170653223756106833452252949295678770124571132e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1.7976931348623157e+308, 0.0, true, "6.03570782819421774321978108606210701191506480312552217045440768852206169109170653223756106833452252949295678770124571132e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1.7976931348623157e+308, 4.9896007738368e+291, false, "6.03570782819421804437750558816906236186088062896793398387877057589954162572508341705424466088931075983619431563137896885e+0");
yield return new("near-one-amplification", 1.0, 1e-308, 1.7976931348623157e+308, 4.9896007738368e+291, true, "6.03570782819421774321978108606210701191506480312552217045440768852206169109170653223756106833452252949295678770124571132e+0");
yield return new("near-one-amplification", 1.0, 1e-308, -1.7976931348623157e+308, 0.0, false, "1.65680650632020930543138261729286914389321647701049924490758817482825036966941625700288738930184991090497333281120414054e-1");
yield return new("near-one-amplification", 1.0, 1e-308, -1.7976931348623157e+308, 0.0, true, "1.65680650632020930543138261729286914389321647701049924490758817482825036966941625700288738930184991090497333281120414054e-1");
yield return new("near-one-amplification", 1.0, 1e-308, -1.7976931348623157e+308, 4.9896007738368e+291, false, "1.65680650632020938809941287762447011319230654300908319340984185597323869098107332618934175993425253969193360884955879518e-1");
yield return new("near-one-amplification", 1.0, 1e-308, -1.7976931348623157e+308, 4.9896007738368e+291, true, "1.65680650632020930543138261729286914389321647701049924490758817482825036966941625700288738930184991090497333281120414054e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1e+300, 0.0, false, "9.99999990000000050000000215019474008609802662350038225593602994907248327116527203321468186530978828157627402416645402812e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1e+300, 0.0, true, "9.99999990000000050000000215019474008609802662350038225593602994907248327116527203321468186530978828157627402416645402812e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1e+300, 3.717542271194458e+283, false, "9.99999990000000049999999843265250606706323277790684858222921108352133489858464419400518464119308933595865164297758445533e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1e+300, 3.717542271194458e+283, true, "9.99999990000000050000000215019474008609802662350038225593602994907248327116527203321468186530978828157627402416645402812e-1");
yield return new("near-one-amplification", 1.0, -1e-308, -1e+300, 0.0, false, "1.00000001000000004999999978498051919100064916155881301934721890259653045226376562409391341474351312337410920605053466657e+0");
yield return new("near-one-amplification", 1.0, -1e-308, -1e+300, 0.0, true, "1.00000001000000004999999978498051919100064916155881301934721890259653045226376562409391341474351312337410920605053466657e+0");
yield return new("near-one-amplification", 1.0, -1e-308, -1e+300, 3.717542271194458e+283, false, "1.00000001000000004999999941322628835401262738808497969467106901581439922741569491039323813920107035300862826036813309329e+0");
yield return new("near-one-amplification", 1.0, -1e-308, -1e+300, 3.717542271194458e+283, true, "1.00000001000000004999999978498051919100064916155881301934721890259653045226376562409391341474351312337410920605053466657e+0");
yield return new("near-one-amplification", 1.0, -1e-308, 1.7976931348623157e+308, 0.0, false, "1.65680650632020930543138261729286914389321647701049924490758817482825036966941625700288738930184991090497333281120414054e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1.7976931348623157e+308, 0.0, true, "1.65680650632020930543138261729286914389321647701049924490758817482825036966941625700288738930184991090497333281120414054e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1.7976931348623157e+308, 4.9896007738368e+291, false, "1.65680650632020922276335235696127229939880399615660067676306716726679979505082704550872161375994082548670757389834295347e-1");
yield return new("near-one-amplification", 1.0, -1e-308, 1.7976931348623157e+308, 4.9896007738368e+291, true, "1.65680650632020930543138261729286914389321647701049924490758817482825036966941625700288738930184991090497333281120414054e-1");
yield return new("near-one-amplification", 1.0, -1e-308, -1.7976931348623157e+308, 0.0, false, "6.03570782819421774321978108606210701191506480312552217045440768852206169109170653223756106833452252949295678770124571132e+0");
yield return new("near-one-amplification", 1.0, -1e-308, -1.7976931348623157e+308, 0.0, true, "6.03570782819421774321978108606210701191506480312552217045440768852206169109170653223756106833452252949295678770124571132e+0");
yield return new("near-one-amplification", 1.0, -1e-308, -1.7976931348623157e+308, 4.9896007738368e+291, false, "6.03570782819421744206205658395516668853740120370683899734250882914961697063268794974176859295828916093364528511463125238e+0");
yield return new("near-one-amplification", 1.0, -1e-308, -1.7976931348623157e+308, 4.9896007738368e+291, true, "6.03570782819421774321978108606210701191506480312552217045440768852206169109170653223756106833452252949295678770124571132e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1e+300, 0.0, false, "1.00000000000000000000000494065645841246570117368298599917989542693401592708216839341606522921040541816306231624717740136e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1e+300, 0.0, true, "1.00000000000000000000000494065645841246570117368298599917989542693401592708216839341606522921040541816306231624717740136e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1e+300, 3.717542271194458e+283, false, "1.00000000000000000000000494065645841246588484467530198160301554292541217737831249681059050627346205593885292829001580162e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1e+300, 3.717542271194458e+283, true, "1.00000000000000000000000494065645841246570117368298599917989542693401592708216839341606522921040541816306231624717740136e+0");
yield return new("near-one-amplification", 1.0, 5e-324, -1e+300, 0.0, false, "9.99999999999999999999995059343541587534298826341424087060157381490568590319469215678028938163310516218517395330044650998e-1");
yield return new("near-one-amplification", 1.0, 5e-324, -1e+300, 0.0, true, "9.99999999999999999999995059343541587534298826341424087060157381490568590319469215678028938163310516218517395330044650998e-1");
yield return new("near-one-amplification", 1.0, 5e-324, -1e+300, 3.717542271194458e+283, false, "9.99999999999999999999995059343541587534482497333740069483277495667054291797643479005032840213161910474030185005957363130e-1");
yield return new("near-one-amplification", 1.0, 5e-324, -1e+300, 3.717542271194458e+283, true, "9.99999999999999999999995059343541587534298826341424087060157381490568590319469215678028938163310516218517395330044650998e-1");
yield return new("near-one-amplification", 1.0, 5e-324, 1.7976931348623157e+308, 0.0, false, "1.00000000000000088817841970012552816174479235211247311621874805904415400901667494766739438002838486028063534244814395382e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1.7976931348623157e+308, 0.0, true, "1.00000000000000088817841970012552816174479235211247311621874805904415400901667494766739438002838486028063534244814395382e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1.7976931348623157e+308, 4.9896007738368e+291, false, "1.00000000000000088817841970012555281364808050875328752124148842044346876806451703172712163097469368695265387269124503489e+0");
yield return new("near-one-amplification", 1.0, 5e-324, 1.7976931348623157e+308, 4.9896007738368e+291, true, "1.00000000000000088817841970012552816174479235211247311621874805904415400901667494766739438002838486028063534244814395382e+0");
yield return new("near-one-amplification", 1.0, 5e-324, -1.7976931348623157e+308, 0.0, false, "9.99999999999999111821580299875260699160428659517776304305932654901975020008053006090996769853058697662591734578785081672e-1");
yield return new("near-one-amplification", 1.0, 5e-324, -1.7976931348623157e+308, 0.0, true, "9.99999999999999111821580299875260699160428659517776304305932654901975020008053006090996769853058697662591734578785081672e-1");
yield return new("near-one-amplification", 1.0, 5e-324, -1.7976931348623157e+308, 4.9896007738368e+291, false, "9.99999999999999111821580299875285351063716816114800132318522487696653915407095872548277787434219998638991746530388150551e-1");
yield return new("near-one-amplification", 1.0, 5e-324, -1.7976931348623157e+308, 4.9896007738368e+291, true, "9.99999999999999111821580299875260699160428659517776304305932654901975020008053006090996769853058697662591734578785081672e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1e+300, 0.0, false, "9.99999999999999999999995059343541587534298826341424087060157381490568590319469215678028938163310516218517395330044650998e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1e+300, 0.0, true, "9.99999999999999999999995059343541587534298826341424087060157381490568590319469215678028938163310516218517395330044650998e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1e+300, 3.717542271194458e+283, false, "9.99999999999999999999995059343541587534115155349108104637037267314082888841294986086058454451133439878274896507459693148e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1e+300, 3.717542271194458e+283, true, "9.99999999999999999999995059343541587534298826341424087060157381490568590319469215678028938163310516218517395330044650998e-1");
yield return new("near-one-amplification", 1.0, -5e-324, -1e+300, 0.0, false, "1.00000000000000000000000494065645841246570117368298599917989542693401592708216839341606522921040541816306231624717740136e+0");
yield return new("near-one-amplification", 1.0, -5e-324, -1e+300, 0.0, true, "1.00000000000000000000000494065645841246570117368298599917989542693401592708216839341606522921040541816306231624717740136e+0");
yield return new("near-one-amplification", 1.0, -5e-324, -1e+300, 3.717542271194458e+283, false, "1.00000000000000000000000494065645841246551750269067001675677531094261967678602432375657337048502309830287534147913289616e+0");
yield return new("near-one-amplification", 1.0, -5e-324, -1e+300, 3.717542271194458e+283, true, "1.00000000000000000000000494065645841246570117368298599917989542693401592708216839341606522921040541816306231624717740136e+0");
yield return new("near-one-amplification", 1.0, -5e-324, 1.7976931348623157e+308, 0.0, false, "9.99999999999999111821580299875260699160428659517776304305932654901975020008053006090996769853058697662591734578785081672e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1.7976931348623157e+308, 0.0, true, "9.99999999999999111821580299875260699160428659517776304305932654901975020008053006090996769853058697662591734578785081672e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1.7976931348623157e+308, 4.9896007738368e+291, false, "9.99999999999999111821580299875236047257140502920752476293342822715012460337636719711468564121373195196042411522632774915e-1");
yield return new("near-one-amplification", 1.0, -5e-324, 1.7976931348623157e+308, 4.9896007738368e+291, true, "9.99999999999999111821580299875260699160428659517776304305932654901975020008053006090996769853058697662591734578785081672e-1");
yield return new("near-one-amplification", 1.0, -5e-324, -1.7976931348623157e+308, 0.0, false, "1.00000000000000088817841970012552816174479235211247311621874805904415400901667494766739438002838486028063534244814395382e+0");
yield return new("near-one-amplification", 1.0, -5e-324, -1.7976931348623157e+308, 0.0, true, "1.00000000000000088817841970012552816174479235211247311621874805904415400901667494766739438002838486028063534244814395382e+0");
yield return new("near-one-amplification", 1.0, -5e-324, -1.7976931348623157e+308, 4.9896007738368e+291, false, "1.00000000000000088817841970012550350984150419547165871119600769825255558569746052320648932773701015449777023101519682929e+0");
yield return new("near-one-amplification", 1.0, -5e-324, -1.7976931348623157e+308, 4.9896007738368e+291, true, "1.00000000000000088817841970012552816174479235211247311621874805904415400901667494766739438002838486028063534244814395382e+0");
yield return new("sparse-scale-sweep", 1.0, -1.4901161193847656e-08, 50331648.0, 0.125, false, "4.72366549221609614983837747988003293775688736300409473719592998392175034954896058214578184490033507876238885799701354213e-1");
yield return new("sparse-scale-sweep", 1.0, -1.4901161193847656e-08, 50331648.0, 0.125, true, "4.72366550101460883925263156828589384426168852256496091910905004011706874974580367154545474030047137045091248536282742898e-1");
yield return new("sparse-scale-sweep", 1.0, 1.4901161193847656e-08, 50331648.0, 0.125, false, "2.11700000872623514764193017612568477422417542660507465690149828892442479256231036151122539926745245748555349966257606332e+0");
yield return new("sparse-scale-sweep", 1.0, 1.4901161193847656e-08, 50331648.0, 0.125, true, "2.11700000478301538351780074732987010968429967433645794477628112451818808131447637452643842628239240551995950866627496363e+0");
yield return new("sparse-scale-sweep", 1.0, -7.450580596923828e-09, 100663296.0, 0.125, false, "4.72366550981312165977494294248836409100360172067932111210097173638521064367524667346723596162142841964308273875986463058e-1");
yield return new("sparse-scale-sweep", 1.0, -7.450580596923828e-09, 100663296.0, 0.125, true, "4.72366551421237800243350666743868807870578895935648836322272517676928296443663158334445880764802786974975572684174169936e-1");
yield return new("sparse-scale-sweep", 1.0, 7.450580596923828e-09, 100663296.0, 0.125, false, "2.11700001266945488238678311878199886432438848370790703536346173669503879008271711171458398453430018011419339817738240748e+0");
yield return new("sparse-scale-sweep", 1.0, 7.450580596923828e-09, 100663296.0, 0.125, true, "2.11700001069784498838938736395427465352384206510115420504463632301675899188376799950497895432608440300157643847270653234e+0");
yield return new("sparse-scale-sweep", 1.0, -9.094947017729282e-13, 824633720832.0, 0.125, false, "4.72366552740799899699540130006550087297235354745002274955245318177292406147853236574719444042210813393653295618054869910e-1");
yield return new("sparse-scale-sweep", 1.0, -9.094947017729282e-13, 824633720832.0, 0.125, true, "4.72366552740853601559166719977743041912048551234747435160453761918095518860896638160505951702417639213988472338562254010e-1");
yield return new("sparse-scale-sweep", 1.0, 9.094947017729282e-13, 824633720832.0, 0.125, false, "2.11700001661219331847067959573102403822432449244173211511424786326239656129805480151723836618307417723019185618203074475e+0");
yield return new("sparse-scale-sweep", 1.0, 9.094947017729282e-13, 824633720832.0, 0.125, true, "2.11700001661195264343333446999719629511420382912511250929812667188867552070383959189940329648462646988555971692523108961e+0");
yield return new("sparse-scale-sweep", 1.0, -1.1102230246251565e-16, 6755399441055744.0, 0.125, false, "4.72366552741014680916435405148872975742030781438798905488748997955581223626614805462136426306018635853250437485734642886e-1");
yield return new("sparse-scale-sweep", 1.0, -1.1102230246251565e-16, 6755399441055744.0, 0.125, true, "4.72366552741014687471838191597471482612851818140005911225506707026845156774875816731149347496269686877473548852127673667e-1");
yield return new("sparse-scale-sweep", 1.0, 1.1102230246251565e-16, 6755399441055744.0, 0.125, false, "2.11700001661267460978681578045634347563098987994641490307644000884034215430272817748352954973105670747493546588298016186e+0");
yield return new("sparse-scale-sweep", 1.0, 1.1102230246251565e-16, 6755399441055744.0, 0.125, true, "2.11700001661267458040753876076596720451955281443713405937293650597671663607707982694510574602567722038532907481197773771e+0");
yield return new("sparse-scale-sweep", 1.0, -7.888609052210118e-31, 9.50737950171172e+29, 0.125, false, "4.72366552741014707138046550943081597217007876297912364634101391754561631218524493834527782254802601053580964155130582835e-1");
yield return new("sparse-scale-sweep", 1.0, -7.888609052210118e-31, 9.50737950171172e+29, 0.125, true, "4.72366552741014707138046550943128176155306802007553444074490518368626637720853894410470032388732457179178406113322361718e-1");
yield return new("sparse-scale-sweep", 1.0, 7.888609052210118e-31, 9.50737950171172e+29, 0.125, false, "2.11700001661267466854536981983667810549712709181009654626324508443021867979244699021080646304696584169746007606400611424e+0");
yield return new("sparse-scale-sweep", 1.0, 7.888609052210118e-31, 9.50737950171172e+29, 0.125, true, "2.11700001661267466854536981983646935317844484536394310850530110094755181034028496397215892802329893032532364514657903960e+0");
yield return new("sparse-scale-sweep", 1.0, -3.054936363499605e-151, 2.4550429559221064e+150, 0.125, false, "4.72366552741014707138046550943267912970203579136476682395657944141200945633080949683587544259334463950142296746371414939e-1");
yield return new("sparse-scale-sweep", 1.0, -3.054936363499605e-151, 2.4550429559221064e+150, 0.125, true, "4.72366552741014707138046550943267912970203579136476682395657944141200945633080949683587544259334463950142296746371414939e-1");
yield return new("sparse-scale-sweep", 1.0, 3.054936363499605e-151, 2.4550429559221064e+150, 0.125, false, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426e+0");
yield return new("sparse-scale-sweep", 1.0, 3.054936363499605e-151, 2.4550429559221064e+150, 0.125, true, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426e+0");
yield return new("sparse-scale-sweep", 1.0, -9.332636185032189e-302, 8.036314553897005e+300, 0.125, false, "4.72366552741014707138046550943267912970203579136476682395657944141200945633080949683587544259334463950142296746371414939e-1");
yield return new("sparse-scale-sweep", 1.0, -9.332636185032189e-302, 8.036314553897005e+300, 0.125, true, "4.72366552741014707138046550943267912970203579136476682395657944141200945633080949683587544259334463950142296746371414939e-1");
yield return new("sparse-scale-sweep", 1.0, 9.332636185032189e-302, 8.036314553897005e+300, 0.125, false, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426e+0");
yield return new("sparse-scale-sweep", 1.0, 9.332636185032189e-302, 8.036314553897005e+300, 0.125, true, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426e+0");
yield return new("sparse-scale-sweep", 1.0, -2.2250738585072014e-308, 3.3706746278668423e+307, 0.125, false, "4.72366552741014707138046550943267912970203579136476682395657944141200945633080949683587544259334463950142296746371414939e-1");
yield return new("sparse-scale-sweep", 1.0, -2.2250738585072014e-308, 3.3706746278668423e+307, 0.125, true, "4.72366552741014707138046550943267912970203579136476682395657944141200945633080949683587544259334463950142296746371414939e-1");
yield return new("sparse-scale-sweep", 1.0, 2.2250738585072014e-308, 3.3706746278668423e+307, 0.125, false, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426e+0");
yield return new("sparse-scale-sweep", 1.0, 2.2250738585072014e-308, 3.3706746278668423e+307, 0.125, true, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426e+0");
yield return new("sparse-scale-sweep", 1.0, -1e-323, 6.741349255733685e+307, 0.125, false, "9.99999999999999333866185224906297612950592555028820149522566441681603753483803323531568498816157439815161034485653328172e-1");
yield return new("sparse-scale-sweep", 1.0, -1e-323, 6.741349255733685e+307, 0.125, true, "9.99999999999999333866185224906297612950592555028820149522566441681603753483803323531568498816157439815161034485653328172e-1");
yield return new("sparse-scale-sweep", 1.0, 1e-323, 6.741349255733685e+307, 0.125, false, "1.00000000000000066613381477509414612130859426411172394779540514198092848980887773754237742488564575593714516957089133279e+0");
yield return new("sparse-scale-sweep", 1.0, 1e-323, 6.741349255733685e+307, 0.125, true, "1.00000000000000066613381477509414612130859426411172394779540514198092848980887773754237742488564575593714516957089133279e+0");
yield return new("exponent-low-decisive", 2.0, 0.0, 1.0, 5.551115123125783e-17, false, "2.00000000000000007695479593116620029041664341713815366179984136189315217631437914477535477221181315094723735432255337807e+0");
yield return new("exponent-low-decisive", 2.0, 0.0, 1.0, 5.551115123125783e-17, true, "2.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0");
yield return new("exponent-low-decisive", 2.0, 0.0, -1.0, -5.551115123125783e-17, false, "4.99999999999999980761301017208450667650916246644680054760727103703961478639310202113257847265570935275551812571858143798e-1");
yield return new("exponent-low-decisive", 2.0, 0.0, -1.0, -5.551115123125783e-17, true, "5.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-1");
yield return new("exponent-low-decisive", 2.0, 0.0, 0.0, 5e-324, false, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0");
yield return new("exponent-low-decisive", 2.0, 0.0, 0.0, 5e-324, true, "1e+0");
yield return new("exponent-low-decisive", 2.0, 0.0, 0.5, 2.7755575615628914e-17, false, "1.41421356237309507600931774808697588439448099151805797773298978988933178684154951324596175878074737195145590215641026986e+0");
yield return new("exponent-low-decisive", 2.0, 0.0, 0.5, 2.7755575615628914e-17, true, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702e+0");
yield return new("exponent-low-decisive", 10.0, 0.0, 1.0, 5.551115123125783e-17, false, "1.00000000000000012781914932003234537245680382409083392670440261696902368520426109154220545198530672142968125154509195453e+1");
yield return new("exponent-low-decisive", 10.0, 0.0, 1.0, 5.551115123125783e-17, true, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+1");
yield return new("exponent-low-decisive", 10.0, 0.0, -1.0, -5.551115123125783e-17, false, "9.99999999999999872180850679967670965278129072632256181650151054098060763085821567736360614288865296549471193611253084211e-2");
yield return new("exponent-low-decisive", 10.0, 0.0, -1.0, -5.551115123125783e-17, true, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-1");
yield return new("exponent-low-decisive", 10.0, 0.0, 0.0, 5e-324, false, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0");
yield return new("exponent-low-decisive", 10.0, 0.0, 0.0, 5e-324, true, "1e+0");
yield return new("exponent-low-decisive", 10.0, 0.0, 0.5, 2.7755575615628914e-17, false, "3.16227766016837953409871376266500168961198281822550338132993905118425350946997444883263820168589077312726472423843956638e+0");
yield return new("exponent-low-decisive", 10.0, 0.0, 0.5, 2.7755575615628914e-17, true, "3.16227766016837933199889354443271853371955513932521682685750485279259443863923822134424810837930029518734728415284005515e+0");
yield return new("exponent-low-decisive", 1e+308, 0.0, 1.0, 5.551115123125783e-17, false, "1.00000000000003937927705420017567840276708512055587796787117775496800682211952677643980607546590831003437360097275603584e+308");
yield return new("exponent-low-decisive", 1e+308, 0.0, 1.0, 5.551115123125783e-17, true, "1.00000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172516e+308");
yield return new("exponent-low-decisive", 1e+308, 0.0, -1.0, -5.551115123125783e-17, false, "9.99999999999960620722945801375049058544310278832417502997913556404010833657276504414323204765652408086037933738517493541e-309");
yield return new("exponent-low-decisive", 1e+308, 0.0, -1.0, -5.551115123125783e-17, true, "9.99999999999999989020936370559544703134915082529105961264150367322296031683506070954361459014856251031722681526036330150e-309");
yield return new("exponent-low-decisive", 1e+308, 0.0, 0.0, 5e-324, false, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0");
yield return new("exponent-low-decisive", 1e+308, 0.0, 0.0, 5e-324, true, "1e+0");
yield return new("exponent-low-decisive", 1e+308, 0.0, 0.5, 2.7755575615628914e-17, false, "1.00000000000001968963852709989399826871961431869650614151309383442160776497761929257601570275495654505363786468865702430e+154");
yield return new("exponent-low-decisive", 1e+308, 0.0, 0.5, 2.7755575615628914e-17, true, "1.00000000000000000548953181472022769363498177597378109589161168665811318694753029295146913909263900447853234927525250827e+154");
yield return new("exponent-low-decisive", 1e-308, 0.0, 1.0, 5.551115123125783e-17, false, "9.99999999999960541028634768067099356341844385800040305248173156379842905501378691518662887528571120444679633968354745439e-309");
yield return new("exponent-low-decisive", 1e-308, 0.0, 1.0, 5.551115123125783e-17, true, "9.99999999999999909326625337248461995470488734032045693707225049331647881341002217023668530611028595157578301758491822824e-309");
yield return new("exponent-low-decisive", 1e-308, 0.0, -1.0, -5.551115123125783e-17, false, "1.00000000000003945897136523348991106486041068282483806957825630204849010144399764221988519604887308540626615412945363031e+308");
yield return new("exponent-low-decisive", 1e-308, 0.0, -1.0, -5.551115123125783e-17, true, "1.00000000000000009067337466275154622619038399768128815146670372007818875083636107034434918744344693185025433076209899389e+308");
yield return new("exponent-low-decisive", 1e-308, 0.0, 0.0, 5e-324, false, "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0");
yield return new("exponent-low-decisive", 1e-308, 0.0, 0.0, 5e-324, true, "1e+0");
yield return new("exponent-low-decisive", 1e-308, 0.0, 0.5, 2.7755575615628914e-17, false, "9.99999999999980270514317383838923375520644149198761955045950093475649854331472833309757714460806683763614441050378064220e-155");
yield return new("exponent-low-decisive", 1e-308, 0.0, 0.5, 2.7755575615628914e-17, true, "9.99999999999999954663312668624229970027635275551902709065412883955749582023799148147816180828307038836518462277055056772e-155");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483648.0, -0.5, false, "9.99999880790717526890256258509918217458712055764307785527266974442067886637448336255615020498739536465800643111437087209e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483648.0, -0.5, true, "9.99999880790717554645828565416577575599535852959246295342855137311589459850405680074765510117236935601919868007262931082e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483648.0, 0.0, false, "9.99999880790717554645828565416577575599535852959246295342855137311589459850405680074765510117236935601919868007262931082e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483648.0, 0.0, true, "9.99999880790717554645828565416577575599535852959246295342855137311589459850405680074765510117236935601919868007262931082e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483648.0, 0.5, false, "9.99999880790717582401400872323237704112245569557799094019104316279993794702445920749491326234884599907457314884672422852e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483648.0, 0.5, true, "9.99999880790717554645828565416577575599535852959246295342855137311589459850405680074765510117236935601919868007262931082e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483647.0, -0.5, false, "1.00000011920929657294214986354850298260920784659812527733594715022875265140683478416091488625142537630671429050801674676e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483647.0, -0.5, true, "1.00000011920929660069772878790006122424250551480097783639593732022905652617914889306695910946673855859260339088327560515e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483647.0, 0.0, false, "1.00000011920929660069772878790006122424250551480097783639593732022905652617914889306695910946673855859260339088327560515e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483647.0, 0.0, true, "1.00000011920929660069772878790006122424250551480097783639593732022905652617914889306695910946673855859260339088327560515e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483647.0, 0.5, false, "1.00000011920929662845330771225162023624787277339971790291897586738680865690232427905248775470466895740142171953389612763e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483647.0, 0.5, true, "1.00000011920929660069772878790006122424250551480097783639593732022905652617914889306695910946673855859260339088327560515e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483648.0, -0.5, false, "1.00000011920929662845330771225162023624787277339971790291897586738680865690232427905248775470466895740142171953389612763e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483648.0, -0.5, true, "1.00000011920929665620888663660318001862530962239436685902529247647424855266301452738213960113969120743092231769595824574e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483648.0, 0.0, false, "1.00000011920929665620888663660318001862530962239436685902529247647424855266301452738213960113969120743092231769595824574e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483648.0, 0.0, true, "1.00000011920929665620888663660318001862530962239436685902529247647424855266301452738213960113969120743092231769595824574e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483648.0, 0.5, false, "1.00000011920929668396446556095474057137481606178494608683511683226420919560273070768012260760191686825860056843566552454e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 2147483648.0, 0.5, true, "1.00000011920929665620888663660318001862530962239436685902529247647424855266301452738213960113969120743092231769595824574e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483649.0, -0.5, false, "9.99999880790717471379111644696601812292722219585188104017546534371430004372115574687348648893300806771449508081386296520e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483649.0, -0.5, true, "9.99999880790717499134683951603259629689774177972962182457208037014219951646066573479641642575541636167238859178309702562e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483649.0, 0.0, false, "9.99999880790717499134683951603259629689774177972962182457208037014219951646066573479641642575541636167238859178309702562e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483649.0, 0.0, true, "9.99999880790717499134683951603259629689774177972962182457208037014219951646066573479641642575541636167238859178309702562e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483649.0, 0.5, false, "9.99999880790717526890256258509918217458712055764307785527266974442067886637448336255615020498739536465800643111437087209e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, -2147483649.0, 0.5, true, "9.99999880790717499134683951603259629689774177972962182457208037014219951646066573479641642575541636167238859178309702562e-1");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 9007199254740992.0, -0.5, false, "1.64872127070012807820683894079437633884571631496046624884116311866361249812873831660163867395145900782774648514270904076e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 9007199254740992.0, -0.5, true, "1.64872127070012812396804683880756765097766366159634584961221945442436402498322842463132827084144622459604252376929868732e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 9007199254740992.0, 0.0, false, "1.64872127070012812396804683880756765097766366159634584961221945442436402498322842463132827084144622459604252376929868732e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 9007199254740992.0, 0.0, true, "1.64872127070012812396804683880756765097766366159634584961221945442436402498322842463132827084144622459604252376929868732e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 9007199254740992.0, 0.5, false, "1.64872127070012816972925473682076023323827708405238946316103089071587900841204755112147704102038787173097165065630913459e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 9007199254740992.0, 0.5, true, "1.64872127070012812396804683880756765097766366159634584961221945442436402498322842463132827084144622459604252376929868732e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 1.8014398509481984e+16, -0.5, false, "2.71828182845904508446533380258256531562069287982524896117070083515324123402675216079993237654086592300912269707770800541e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 1.8014398509481984e+16, -0.5, true, "2.71828182845904515991281063696761320865958722503430152835348388290744697387615216043533391955515428706576374097559915094e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 1.8014398509481984e+16, 0.0, false, "2.71828182845904515991281063696761320865958722503430152835348388290744697387615216043533391955515428706576374097559915094e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 1.8014398509481984e+16, 0.0, true, "2.71828182845904515991281063696761320865958722503430152835348388290744697387615216043533391955515428706576374097559915094e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 1.8014398509481984e+16, 0.5, false, "2.71828182845904523536028747135266319578662985542829137599329073714634974006100094178257710006328712701481597866150351234e+0");
yield return new("integer-boundary", 1.0, 5.551115123125783e-17, 1.8014398509481984e+16, 0.5, true, "2.71828182845904515991281063696761320865958722503430152835348388290744697387615216043533391955515428706576374097559915094e+0");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, 9007199254740992.0, 1.0, false, "-1.64872127070012821549046263483395408562755658232863234263983027285063189474722178269697538006597502537809674250391805343e+0");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, 9007199254740992.0, 1.0, true, "1.64872127070012812396804683880756765097766366159634584961221945442436402498322842463132827084144622459604252376929868732e+0");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, 1.8014398509481984e+16, -1.0, false, "-2.71828182845904500901785696819751951666994681980107555182299607210271258939195450350087790893317861802210926697707008553e+0");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, 1.8014398509481984e+16, -1.0, true, "2.71828182845904515991281063696761320865958722503430152835348388290744697387615216043533391955515428706576374097559915094e+0");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, -9007199254740992.0, -1.0, false, "-6.06530659712633398351888151714251872969944439307319763785250446067334501453810050800363959471856442807851683613645971137e-1");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, -9007199254740992.0, -1.0, true, "6.06530659712633432021103329416823443392082670825529212349435456595737020271205027288103106858483423923558690036813906733e-1");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, 1.8014398509481984e+16, 2.0, false, "2.71828182845904546170271797450782572169664745772046582787430935660563791026251750437224807171628972191681347343949457250e+0");
yield return new("negative-integral-low-parity", -1.0, -5.551115123125783e-17, 1.8014398509481984e+16, 2.0, true, "2.71828182845904515991281063696761320865958722503430152835348388290744697387615216043533391955515428706576374097559915094e+0");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, -63.0, 0.0, false, "-7.84637716923336193094276418080845951698677952417941977825280137466430664062540901730244923006097955537358902365148567930e-7");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, -63.0, 0.0, true, "-7.84637716923336193094276418080845951698677952417941977825280137466430664062540901730244923006097955537358902365148567930e-7");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, -7.0, 0.0, false, "-2.09715200000000032596290111541750942007143935597054904472354026424969178823336257582288542893149606390553484344185229617e-1");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, -7.0, 0.0, true, "-2.09715200000000032596290111541750942007143935597054904472354026424969178823336257582288542893149606390553484344185229617e-1");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, 7.0, 0.0, false, "-4.76837158203124925884617115248725268598054644138679080671587238030405894387593626522625434910843865766484831137482666557e+0");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, 7.0, 0.0, true, "-4.76837158203124925884617115248725268598054644138679080671587238030405894387593626522625434910843865766484831137482666557e+0");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, 63.0, 0.0, false, "-1.27447352890596003878628567420639928593585223694067025582290667827041060471036299931225630412030416058578361639390811030e+6");
yield return new("negative-int-dispatch", -1.25, 2.7755575615628914e-17, 63.0, 0.0, true, "-1.27447352890596003878628567420639928593585223694067025582290667827041060471036299931225630412030416058578361639390811030e+6");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, 1023.75, 2.842170943040401e-14, false, "1.51167371283200659210927749445831867300278116640730489075993079782352872371010863103529344046487166465683406944749400658e+308");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, 1023.75, 2.842170943040401e-14, true, "1.51167371283197681149050360792762285479984614398060067175336699939863243132605637334601968571705043855461270459295947410e+308");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, -1021.75, 2.842170943040401e-14, false, "2.64607366394329882602278018505471453219801417365895973768744736360495374276173929438524222801773175136090960631498408505e-308");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, -1021.75, 2.842170943040401e-14, true, "2.64607366394324669723972032257520622629018125038191238166510283219347896537802857124767473344252495860138650471513807626e-308");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, -1073.5, 2.842170943040401e-14, false, "6.98714337051306154357650259856640660914894887397875495745208391781282864188037390039407535912538644253170805586301196525e-324");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, -1073.5, 2.842170943040401e-14, true, "6.98714337051292389386329437375900902789440793900381182641127420117222134649185411086204870476702605967157814102129415083e-324");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, -1074.25, 2.842170943040401e-14, false, "4.15458030487911314918040569454298230056016502486922828266899949825508028212461989617352758759595633367249175862449308942e-324");
yield return new("finite-range-shoulder", 2.0, 5.551115123125783e-17, -1074.25, 2.842170943040401e-14, true, "4.15458030487903130217124304205892108740980581437728646467776432195598349875514778618628833920062515065937479636378756587e-324");
yield return new("random-000", 1.3357935182666557e+261, 5.462437423415177e+244, 0.45684583223538877, -1.3877787807814457e-17, false, "1.96881859769326624321021633044133110784883625275714059276398668492779832853735659139015620432227225245396811942152809088e+119");
yield return new("random-000", 1.3357935182666557e+261, 5.462437423415177e+244, 0.45684583223538877, -1.3877787807814457e-17, true, "1.96881859769328267146074804199020629435438393235989501361301043504556207832947848624367320831229770150446473830187634678e+119");
yield return new("random-001", 2.3559529795817903e+194, -8.10452259547069e+177, -0.7027571228852727, -2.7755575615628914e-17, false, "2.53265140934689526470585379250678296884792410451764155378845134323277205974843037887495017393845268091156351405719872489e-137");
yield return new("random-001", 2.3559529795817903e+194, -8.10452259547069e+177, -0.7027571228852727, -2.7755575615628914e-17, true, "2.53265140934692672591581431617803269356928332344104266942110202563837137432144206962396484481709094497156685039849595374e-137");
yield return new("random-002", 1.8244919405440664e-131, 6.256509672447191e-148, -1.7191270560499683, 5.551115123125783e-17, false, "5.71094729385683478172640717629701071533042595146680507595510433537702401091609462061274971743972136671002184827540823160e+224");
yield return new("random-002", 1.8244919405440664e-131, 6.256509672447191e-148, -1.7191270560499683, 5.551115123125783e-17, true, "5.71094729385693021696469330732517528115565823063315402618953908600965978288609764966630707651755595392577364669881124735e+224");
yield return new("random-003", 2.5645929053323523e+156, -9.526820527087379e+139, -1.5520891200078772, 5.551115123125783e-17, false, "1.73485912042282352641093538331173777961135436531978454822185233536832192590605469049338842786082617307614096269693320486e-243");
yield return new("random-003", 2.5645929053323523e+156, -9.526820527087379e+139, -1.5520891200078772, 5.551115123125783e-17, true, "1.73485912042278884298998022694815868395951015301766115229351045993343666739571974771936372606636461521531736881806390679e-243");
yield return new("random-004", 3.576207263053654e+262, 1.7479799754928565e+246, 1.0946904818487737, -5.551115123125783e-17, false, "2.59856021874551369738447340482444066561014082199563943618774238781346605455303403507655041974259733651523614196324351122e+287");
yield return new("random-004", 3.576207263053654e+262, 1.7479799754928565e+246, 1.0946904818487737, -5.551115123125783e-17, true, "2.59856021874560090338970210850884530238661734437707470323010355408226820809595867210774423698325866969260171823322710511e+287");
yield return new("random-005", 6.451697406171294e-48, -3.0385816786431356e-64, 1.0877036940561637, 5.551115123125783e-17, false, "4.68714161614623688177757960006865673647806566676393966688006202435911543114346337835163854810205702684687399526330990690e-52");
yield return new("random-005", 6.451697406171294e-48, -3.0385816786431356e-64, 1.0877036940561637, 5.551115123125783e-17, true, "4.68714161614626515380646404194042339689178817858498577465562877772986811406111475852645778422870918174939238668012007547e-52");
yield return new("random-006", 2.5469105818254866e-188, 7.973755960878054e-205, -0.4005015811160203, 1.3877787807814457e-17, false, "1.35421656508989341728195352351602463877631559500641195682861108605584841655707115829498700204945055817838693111025382781e+75");
yield return new("random-006", 2.5469105818254866e-188, 7.973755960878054e-205, -0.4005015811160203, 1.3877787807814457e-17, true, "1.35421656508990153516827682976201759734670418131782338393379751432735491515853740191231446340964313632713676935356282913e+75");
yield return new("random-007", 1.4235538619106066e-142, -4.552209918945439e-159, -1.3261432713030543, 5.551115123125783e-17, false, "1.28513500857442252338702226046991216470826874462296738049183473630356397071446679802045279066593083467729743075486643588e+188");
yield return new("random-007", 1.4235538619106066e-142, -4.552209918945439e-159, -1.3261432713030543, 5.551115123125783e-17, true, "1.28513500857444582380370401720521542264970325384624312225570102489859066884451667475487230248802345251590187182865058637e+188");
yield return new("random-008", 5.414610390554895e+102, -2.4866161820489332e+86, 0.6756539342745523, -2.7755575615628914e-17, false, "2.58427584966220167008143036339081532710407514798724126837048596780739051892536048353505521765944927134641910352020551004e+69");
yield return new("random-008", 5.414610390554895e+102, -2.4866161820489332e+86, 0.6756539342745523, -2.7755575615628914e-17, true, "2.58427584966221863755434572507921411898218478618682588878120140862926161740635577444436580707847401112952245184144890308e+69");
yield return new("random-009", 6.347281069045675e+236, 2.259211166966574e+220, 0.29250329442782635, 1.3877787807814457e-17, false, "1.84304967218459148637076970894218764668165583795471372897970300354123786549011470316498150859941246091095633625053451908e+69");
yield return new("random-009", 6.347281069045675e+236, 2.259211166966574e+220, 0.29250329442782635, 1.3877787807814457e-17, true, "1.84304967218457754005752507053719333509409708716721141422894590517680676040308725032465339317732783624346122706376561327e+69");
yield return new("random-010", 7.676679617520787e-181, -2.6755485217387732e-197, -1.4615296041326278, 5.551115123125783e-17, false, "1.75045598860749823716087905627909593394866560970378728902811089092367232499304404428358245669419222661964023373172141840e+263");
yield return new("random-010", 7.676679617520787e-181, -2.6755485217387732e-197, -1.4615296041326278, 5.551115123125783e-17, true, "1.75045598860753853637555461157331448922116352977540479305377841651756901873063566107013712083174182685207411765547858444e+263");
yield return new("random-011", 2.1881327177507215e+55, -6.80564733841877e+38, 5.34468586168356, -2.220446049250313e-16, false, "5.96086484193446336931437682453314110687274973259113460981479141285498534224364316141186960022822598381117620554400475156e+295");
yield return new("random-011", 2.1881327177507215e+55, -6.80564733841877e+38, 5.34468586168356, -2.220446049250313e-16, true, "5.96086484193463202652822990505166037010464725361901546835689805296364925851344473287047215934604694566652411629869373841e+295");
yield return new("random-012", 3.2276733000079612e+16, -1.0, -16.33086110992666, 8.881784197001252e-16, false, "2.48666544018523813418011342340487637846129835015139861843856144937786190387034065063430074053096496178212265407011803443e-270");
yield return new("random-012", 3.2276733000079612e+16, -1.0, -16.33086110992666, 8.881784197001252e-16, true, "2.48666544018515417829848901493377404794428065391053428416858609989761254321624053892616899931305994165570705094238697761e-270");
yield return new("random-013", 6.624301097443079e-258, 2.310648801106982e-274, 0.473225584258651, -1.3877787807814457e-17, false, "1.97871728709652884025877247736865984487648655958126430728485421141934402202803815399868125616342211892799389130092721346e-122");
yield return new("random-013", 6.624301097443079e-258, 2.310648801106982e-274, 0.473225584258651, -1.3877787807814457e-17, true, "1.97871728709651257897059543919940006118244933509076993889316582492672975423477909271307783891592454467407092989550052304e-122");
yield return new("random-014", 5.199376664590115e+231, 1.723641332219371e+215, -0.3539271035617578, -1.3877787807814457e-17, false, "9.75988081404420127075277411270038774947205357926822602451221646823634024573479412878580831515318423488845147657818768617e-83");
yield return new("random-014", 5.199376664590115e+231, 1.723641332219371e+215, -0.3539271035617578, -1.3877787807814457e-17, true, "9.75988081404427353714556442847390165864251866440760303954710490095090282519663572088699246840525728996190975184684283872e-83");
yield return new("random-015", 5.560551009026573e-15, 1.9721522630525295e-31, -4.598351367413514, 2.220446049250313e-16, false, "3.53962230460327577040642613968535043641770013808302090093532489444061000789083174515324895669430001397218569271838232285e+65");
yield return new("random-015", 5.560551009026573e-15, 1.9721522630525295e-31, -4.598351367413514, 2.220446049250313e-16, true, "3.53962230460330156783799572661348162754925543412403508946250937453274023504632547396392885539810257664439653599734603082e+65");
yield return new("random-016", 10453810903.560575, 4.76837158203125e-07, -21.655643276422516, 8.881784197001252e-16, false, "1.06209290571311655809299594746780731189834736388576550073055495745625113583903926256282878708650651105882507038210461561e-217");
yield return new("random-016", 10453810903.560575, 4.76837158203125e-07, -21.655643276422516, 8.881784197001252e-16, true, "1.06209290571309479529681246712398597712242588520135137961759315375921219003153644141686781374727830154587711665928985335e-217");
yield return new("random-017", 7.980986414495294e+21, 262144.0, -0.1827751485966899, -6.938893903907228e-18, false, "9.92769338436116797162678271264093460563317808326617677117758361607637991186725787427811996888425405808618029146712709915e-5");
yield return new("random-017", 7.980986414495294e+21, 262144.0, -0.1827751485966899, -6.938893903907228e-18, true, "9.92769338436117144570176532927249440979829932558072678686992568577482225709806809732951957952860601292065873254015973877e-5");
yield return new("random-018", 4.895166298396345e-50, 2.3738919364399497e-66, 3.624180182009954, 1.1102230246251565e-16, false, "1.95358549834419408381505792795536796121614630987709678486950850172337607904231844510003707694093408313589681840541956695e-179");
yield return new("random-018", 4.895166298396345e-50, 2.3738919364399497e-66, 3.624180182009954, 1.1102230246251565e-16, true, "1.95358549834421870990106973725253078293308917381169239245587674506274729237999511449781125059577038960281709163193264095e-179");
yield return new("random-019", 4.361037167702552e-119, 1.3758210268297398e-135, -0.1457616233915608, 6.938893903907228e-18, false, "1.78815654973016614554937973581285217232471565027417677098165913345587819749992427623797253825852723173010256862607547630e+17");
yield return new("random-019", 4.361037167702552e-119, 1.3758210268297398e-135, -0.1457616233915608, 6.938893903907228e-18, true, "1.78815654973016952711590203540600300840480390262968386712259029801974236186170864962437007381358164598116122897623777916e+17");
yield return new("random-020", 1.431665585565575e-133, -4.887898181599368e-150, -0.8368043898102316, -2.7755575615628914e-17, false, "1.46074672704763625942234918956772775375372532028089948211716931303114454431223811794969644263522276989981569936625444380e+111");
yield return new("random-020", 1.431665585565575e-133, -4.887898181599368e-150, -0.8368043898102316, -2.7755575615628914e-17, true, "1.46074672704762385766268226011901850175932628898397653821111238360513131815964621798471393744749246423652033925057149444e+111");
yield return new("random-021", 1.3321258970455117e-115, -5.635362925894614e-132, 1.5397367399105963, 5.551115123125783e-17, false, "1.32446912918716768385708461676696596786361596215610097406009660701256687806757644481307856071318838536436416419461011568e-177");
yield return new("random-021", 1.3321258970455117e-115, -5.635362925894614e-132, 1.5397367399105963, 5.551115123125783e-17, true, "1.32446912918718713141200235476068740490488045353967109533068351235749940205290367176911066744259607769843413769046823827e-177");
yield return new("random-022", 1.6425045376852736e+277, 4.9201262289254483e+260, 0.3533506331186011, 1.3877787807814457e-17, false, "9.00066835440140738922624720081741026997155252690893359864757340866712105320339524170568267138490529346433855639169454077e+97");
yield return new("random-022", 1.6425045376852736e+277, 4.9201262289254483e+260, 0.3533506331186011, 1.3877787807814457e-17, true, "9.00066835440132765804270606051785347998734140327692015232393540877775627572768843069049946094138936008859257573513683880e+97");
yield return new("random-023", 1.9854103053010905e+130, -6.156563468186638e+113, 0.009289002081685831, 4.336808689942018e-19, false, "1.62306907266573625112922906166277329457337490169003064075029074592271551749714210768870274893356790122806843741660793300e+1");
yield return new("random-023", 1.9854103053010905e+130, -6.156563468186638e+113, 0.009289002081685831, 4.336808689942018e-19, true, "1.62306907266573603994562069005303851595924027968855608389323451439318633970299775861445216462810163975853331724427833330e+1");
yield return new("random-024", 1.8904510046853114e-29, 7.006492321624085e-46, 5.900833039994077, 2.220446049250313e-16, false, "3.21964689473648323208211862190569542999642569875867839598983813846234577046089837879106993964020003590167615831422364974e-170");
yield return new("random-024", 1.8904510046853114e-29, 7.006492321624085e-46, 5.900833039994077, 2.220446049250313e-16, true, "3.21964689473653051459259838442649441800690341842627256962141744564072838416504508745603117042654155729349534776389320707e-170");
yield return new("random-025", 2.0891820054319003e-159, 6.317460331175305e-176, -0.0782373070570619, -3.469446951953614e-18, false, "2.59835053460730493570716015726433242311861162604715762176029115261881375395238814390144708800386846871714088504391001712e+12");
yield return new("random-025", 2.0891820054319003e-159, 6.317460331175305e-176, -0.0782373070570619, -3.469446951953614e-18, true, "2.59835053460730164191693181583549290608534429140582252883138841541513653156325515184461786026598399160596250960620493768e+12");
yield return new("random-026", 1.3378366950283785e-216, 4.0257179809982083e-233, -0.8725854496167593, -2.7755575615628914e-17, false, "2.33431579131503034087446881209259209008342434510209759965631355329400379554905435167560243181330260917597921583876535079e+188");
yield return new("random-026", 1.3378366950283785e-216, 4.0257179809982083e-233, -0.8725854496167593, -2.7755575615628914e-17, true, "2.33431579131499813574399367252793947723936474578525715698270100069670486011857754150045285578583906878388224438700687775e+188");
yield return new("random-027", 2.4516871004869273e-61, 8.636168555094445e-78, -0.09712736712415687, -3.469446951953614e-18, false, "7.70799954690467752907693659394455929175576505959329001277943501771017581566878945163194440667242782951693613111478861276e+5");
yield return new("random-027", 2.4516871004869273e-61, 8.636168555094445e-78, -0.09712736712415687, -3.469446951953614e-18, true, "7.70799954690467379686980998371049922067610281835187835005581544096844885939557554780261623369229586124383368599230692607e+5");
yield return new("random-028", 1.8346326158663564e-08, 8.271806125530277e-25, 20.137872358909824, -8.881784197001252e-16, false, "1.60080881702408663176596009091474445977220858886472807232511656640478989352397573052774587675748459886100952371913561747e-156");
yield return new("random-028", 1.8346326158663564e-08, 8.271806125530277e-25, 20.137872358909824, -8.881784197001252e-16, true, "1.60080881702406130398473563727734129322702071934673981859502847848716133934445494228770411113772441949523979182518182699e-156");
yield return new("random-029", 3.442482897302349e+213, -1.495020541582441e+197, 0.394554796345418, 1.3877787807814457e-17, false, "1.78647507736742284342818868688595819303470787261093160774831500159406797266612892517652397607540002522725962767817709392e+84");
yield return new("random-029", 3.442482897302349e+213, -1.495020541582441e+197, 0.394554796345418, 1.3877787807814457e-17, true, "1.78647507736741065337025542042356808653480904157723495189104328658005096647183891140588263844552028184499639975699664205e+84");
yield return new("random-030", 9.54299864372222e-264, 4.407212831701244e-280, -0.3544610869529642, 1.3877787807814457e-17, false, "1.70006996385207312568443460577770083145539444026321591548754155998643579291437102676284672554985577750149064413440271791e+93");
yield return new("random-030", 9.54299864372222e-264, 4.407212831701244e-280, -0.3544610869529642, 1.3877787807814457e-17, true, "1.70006996385208741436146116301104311726380654381215168395821538605556841242191972961209501891661605535439607985128329837e+93");
yield return new("random-031", 1.102671443254035e-133, 4.887898181599368e-150, 0.6453987716185767, -2.7755575615628914e-17, false, "1.54652894689520585671870406798094405003322437614184186409808842359941621626231235194528448553411551839666978301606181773e-86");
yield return new("random-031", 1.102671443254035e-133, 4.887898181599368e-150, 0.6453987716185767, -2.7755575615628914e-17, true, "1.54652894689519271545903772069589833606122446978771177736781826658970783480622982451402022217018512397391352853761616563e-86");
yield return new("random-032", 1.991050135162202e+26, 8589934592.0, 9.74145372441443, -4.440892098500626e-16, false, "1.55343184943861202946808322969974479334322988066429042869046773561682429857750726121526185860303152700861195239781177123e+256");
yield return new("random-032", 1.991050135162202e+26, 8589934592.0, 9.74145372441443, -4.440892098500626e-16, true, "1.55343184943865380468439644799197633030037842153449937974183681224241520375236497159714958718567386900141774013215320670e+256");
yield return new("random-033", 1.7421260856590708e-78, -5.992545734006014e-95, 0.6045100849678194, -2.7755575615628914e-17, false, "9.86162336932564276919698147955832781395083124104974302790633385110557978553373660297141864092244238655590179125769453062e-48");
yield return new("random-033", 1.7421260856590708e-78, -5.992545734006014e-95, 0.6045100849678194, -2.7755575615628914e-17, true, "9.86162336932559376146981933848810046035026289122903266398918581682023704496416708321225575567275146985023991631770835745e-48");
yield return new("random-034", 7.868089077215248e+288, 2.704867999414606e+272, -0.6846979154964891, -2.7755575615628914e-17, false, "1.56171045097702297486982046545068832914295932498063581539257715726541594779219079633334990191950124417987965993120509343e-198");
yield return new("random-034", 7.868089077215248e+288, 2.704867999414606e+272, -0.6846979154964891, -2.7755575615628914e-17, true, "1.56171045097705180906115617954020635588953885777616068575979411623873964078814336057355871345634338328467117065097732849e-198");
yield return new("random-035", 1.5742120441905407e-276, -5.010420900022432e-293, -0.7856849687533353, -2.7755575615628914e-17, false, "4.94563154215087057143559318718411042356517291304431541628279716628688635066949240571026481522870777236666384305680914385e+216");
yield return new("random-035", 1.5742120441905407e-276, -5.010420900022432e-293, -0.7856849687533353, -2.7755575615628914e-17, true, "4.94563154215078339751651440139922056741450379984600126969646967281523279570886579601623411666154761493587567469615420282e+216");
yield return new("random-036", 1.7193419115002317e+129, -7.695704335233297e+112, 2.171747803661485, 1.1102230246251565e-16, false, "4.64102728376025853528239059348798667336002529010534635548132776124486081571040629076177688344761362224992579923040579096e+280");
yield return new("random-036", 1.7193419115002317e+129, -7.695704335233297e+112, 2.171747803661485, 1.1102230246251565e-16, true, "4.64102728376010520730577324956381006456820317148918758426796777118398574969093307394840435699494960091021106719105547455e+280");
yield return new("random-037", 1.6412857050246543e-155, -5.17526350329881e-172, 1.3017543608224311, 5.551115123125783e-17, false, "3.22248590388568347320963896578765691497562063235931635656958039143889763691808935660847933468125085294735417484972804679e-202");
yield return new("random-037", 1.6412857050246543e-155, -5.17526350329881e-172, 1.3017543608224311, 5.551115123125783e-17, true, "3.22248590388574722836433492979542227528346326288944222255979787748918600325270640456071079137003009288604765378574430061e-202");
yield return new("random-038", 3.870813175362113e-92, 1.7031839360032603e-108, -2.0268631667350587, 1.1102230246251565e-16, false, "1.90553394472603036594444889880452611434091607542687332001052587782564780080540631913431849182534303943834360694536243638e+185");
yield return new("random-038", 3.870813175362113e-92, 1.7031839360032603e-108, -2.0268631667350587, 1.1102230246251565e-16, true, "1.90553394472607489533577164625714208582219859991524704317718738317263555916609237147568027222036618524805456631514678692e+185");
yield return new("random-039", 1.3196993517521114e+202, 5.438853046443695e+185, 1.0991235721689876, -5.551115123125783e-17, false, "1.43013980396289663791141188381714368606687682313337805169406733118324617493365640702681916367999172476269373633127342721e+222");
yield return new("random-039", 1.3196993517521114e+202, 5.438853046443695e+185, 1.0991235721689876, -5.551115123125783e-17, true, "1.43013980396293358538328907679827045868468343655288123242867304671796132380443015493116788133405906423769875882751100401e+222");
yield return new("random-040", 3.1429099896769045e-281, -1.5290591125556738e-297, 1.0989609623871577, -5.551115123125783e-17, false, "5.47668749416887685525934751465984215116558959557523685067140397393482501801956560599304752641164956282137395861007892408e-309");
yield return new("random-040", 3.1429099896769045e-281, -1.5290591125556738e-297, 1.0989609623871577, -5.551115123125783e-17, true, "5.47668749416868049622862447035375705689532889128780461411080119882393238842551428193442954119652735874358379045890188714e-309");
yield return new("random-041", 4.2020950860882085e-244, -1.6259745436952323e-260, -0.6384032708714676, 2.7755575615628914e-17, false, "2.35708605466927840689909016556300030137924282489509146242798865051904606151406895553078314381035163854667077762382663239e+155");
yield return new("random-041", 4.2020950860882085e-244, -1.6259745436952323e-260, -0.6384032708714676, 2.7755575615628914e-17, true, "2.35708605466931506922955634471742182616227176003268826819023757974605481600525314397272252830632311293798223389903047313e+155");
yield return new("random-042", 1.1684492915782709e-56, 5.659799424266695e-73, -0.3300542514845709, -1.3877787807814457e-17, false, "2.88883780065459708804241397482054585466832871356875916443753582548792289906243438068750887692616811651017167760061229077e+18");
yield return new("random-042", 1.1684492915782709e-56, 5.659799424266695e-73, -0.3300542514845709, -1.3877787807814457e-17, true, "2.88883780065459192480056676888862958613478365823033364540347648170851984849008512417192267802702435913308944010252986020e+18");
yield return new("random-043", 1.3183995727570355e-128, -6.406665904585923e-145, -1.554354974464628, -5.551115123125783e-17, false, "5.89985035863792997793989054531942750677883049654317524202124871614315230436044897631477447771425351726845688693127003210e+198");
yield return new("random-043", 1.3183995727570355e-128, -6.406665904585923e-145, -1.554354974464628, -5.551115123125783e-17, true, "5.89985035863783354189573036044777891548960159688917379820081507782485734093148828452916758505832289356249807572209019104e+198");
yield return new("random-044", 4.731218049620999e-254, 1.8928834978668395e-270, -0.5393327752753253, 2.7755575615628914e-17, false, "4.23145647456107581855201640822774734775922960956460890629382864288617228591890026329365095059206390283257069174423040961e+136");
yield return new("random-044", 4.731218049620999e-254, 1.8928834978668395e-270, -0.5393327752753253, 2.7755575615628914e-17, true, "4.23145647456114432538688823308466365939116694529056666577646880649535337375585764901402900799975046638700947838932924896e+136");
yield return new("random-045", 4.0817817434942627e-190, 1.245899368887196e-206, -1.1784645716827689, 5.551115123125783e-17, false, "1.54313455597906718232880370387774961446048376328639800064496628076379883625267724018373182579282654074435079424137241585e+223");
yield return new("random-045", 4.0817817434942627e-190, 1.245899368887196e-206, -1.1784645716827689, 5.551115123125783e-17, true, "1.54313455597910453785126629348814481981011820372507043136000173932825593942637055259310814982054805029122765242100313441e+223");
yield return new("random-046", 5.5849101672014115e-120, 1.7197762835371747e-136, -0.6775382252032234, 2.7755575615628914e-17, false, "6.28716704725469347460469405555972614449419776006677005635877304487055546793843047619525363459039361828957802202032494120e+80");
yield return new("random-046", 5.5849101672014115e-120, 1.7197762835371747e-136, -0.6775382252032234, 2.7755575615628914e-17, true, "6.28716704725474139166660642078549616052777748188932656137855341970864920042980409688409936673115104687759234818799755990e+80");
yield return new("random-047", 5.207673820002838e-92, 1.7031839360032603e-108, 1.5878601386135713, 5.551115123125783e-17, false, "1.13448127165624986148806731221352160777540410221773779760118552140638291624241714008228485873700690849609080954914706685e-145");
yield return new("random-047", 5.207673820002838e-92, 1.7031839360032603e-108, 1.5878601386135713, 5.551115123125783e-17, true, "1.13448127165626309834433568715521316658517664508088754224434291078238366617743875611566595250652765902654776326571682618e-145");
yield return new("random-048", 1.0225227837976616e-209, 3.377017006114542e-226, 0.24488128917452173, 6.938893903907228e-18, false, "6.64017152107827523915815844989269074610403860516415422787729470998295950860752065564035406132663022511653787192321154636e-52");
yield return new("random-048", 1.0225227837976616e-209, 3.377017006114542e-226, 0.24488128917452173, 6.938893903907228e-18, true, "6.64017152107829741149251370638140813994652445539224786663210412078452034162109886626981139662893341148040974749778272771e-52");
yield return new("random-049", 2.7669383331691228e-282, -9.556619453472961e-299, 0.5745974547360181, -2.7755575615628914e-17, false, "1.65002126271876098754425194110182511848907883708730229903781963281521554330594642712864517933505783483278801432875204993e-162");
yield return new("random-049", 2.7669383331691228e-282, -9.556619453472961e-299, 0.5745974547360181, -2.7755575615628914e-17, true, "1.65002126271873129664575389241642280124669843893471201885020845553497879055451936808693536332280738670587927684900766542e-162");
yield return new("random-050", 1.5428713735590219e+258, 5.334411546303884e+241, -0.1866244981521483, 6.938893903907228e-18, false, "6.54233136419481637444502226417683766999985216083630202069938967561161439156918078303149002200008316784935596312088471659e-49");
yield return new("random-050", 1.5428713735590219e+258, 5.334411546303884e+241, -0.1866244981521483, 6.938893903907228e-18, true, "6.54233136419478938617287610609099529272116307666198881878431252846467329249736871113363585048754140834529406313783218456e-49");
yield return new("random-051", 1.5552318018113262e-206, -6.916130828522582e-223, 0.584962636811484, -2.7755575615628914e-17, false, "4.07276920991995978292500302341523729137089277157264992250834873915136687669413070792039548838313186558063442729399750246e-121");
yield return new("random-051", 1.5552318018113262e-206, -6.916130828522582e-223, 0.584962636811484, -2.7755575615628914e-17, true, "4.07276920991990621332388892114554850829138595388320350256176247059526398207313875912775474060525190625714841014751623145e-121");
yield return new("random-052", 2.209357498904188e+97, -9.485687950320943e+80, -0.6177948174587636, 2.7755575615628914e-17, false, "7.26468785945380763124798319451999702094149056758727773305764763058980122317564538377382982386992143359695313750661132588e-61");
yield return new("random-052", 2.209357498904188e+97, -9.485687950320943e+80, -0.6177948174587636, 2.7755575615628914e-17, true, "7.26468785945376243594931570130333071849515077953978202886683988243873921691380561539537593714964846315185784711953950057e-61");
yield return new("random-053", 2.166284969379228e-182, 8.361089130433666e-199, 1.079493982097385, -5.551115123125783e-17, false, "7.84328892472810062309501594167408034134778530647582633202377651327295354913651472759209353276563241426141435932816901778e-197");
yield return new("random-053", 2.166284969379228e-182, 8.361089130433666e-199, 1.079493982097385, -5.551115123125783e-17, true, "7.84328892472791850055913317688210642326087494783053930024330734278773711344298998194748893350971153283429289355077681772e-197");
yield return new("random-054", 1.1416306258070114e-213, -4.1223352125421653e-230, 0.16324273580243145, 6.938893903907228e-18, false, "1.73255851852586466195953393450731544527532518223154692607304182355298810670424307402165553514568335001036325854323459924e-35");
yield return new("random-054", 1.1416306258070114e-213, -4.1223352125421653e-230, 0.16324273580243145, 6.938893903907228e-18, true, "1.73255851852587055658402634055276604491294873100345857044220722388929287884343166252333061300737888281794428443560433203e-35");
yield return new("random-055", 3.2561638112913872e+84, -1.0783978666860256e+68, 3.2424115379220373, 1.1102230246251565e-16, false, "1.05918989963897145222689845343232834427501450784541551779232302712607336843998365860833475543295293210309278213985480562e+274");
yield return new("random-055", 3.2561638112913872e+84, -1.0783978666860256e+68, 3.2424115379220373, 1.1102230246251565e-16, true, "1.05918989963894856876335682506754016937536203188627207034069202477139861353478568761644656283788767340321968244933054424e+274");
yield return new("random-056", 9.768991799925471e+297, -2.90432989937067e+281, 0.82395829184719, 2.7755575615628914e-17, false, "3.39787645215994806532492319829621368122066657740829103102784020711262022683557358228457184579203028534539917875957279811e+245");
yield return new("random-056", 9.768991799925471e+297, -2.90432989937067e+281, 0.82395829184719, 2.7755575615628914e-17, true, "3.39787645215988335479115663686686414714728695778203554398486592914180882705208718066327932982010273433069202197282162554e+245");
yield return new("random-057", 1.11473599902801e-107, -3.7818280418450374e-124, 2.947706470424298, 1.1102230246251565e-16, false, "5.42571467975422682925830574997780998669232112672665334837711781696884981769976359625020962994886817125960256853936513836e-316");
yield return new("random-057", 1.11473599902801e-107, -3.7818280418450374e-124, 2.947706470424298, 1.1102230246251565e-16, true, "5.42571467975437517501999094604022877715735945427690424307151034869897602551340810612085369862526735126870489392397535730e-316");
yield return new("random-058", 6246484989.905359, 2.384185791015625e-07, -16.2711731368527, 8.881784197001252e-16, false, "4.10691323776995889606657301547394985929570580161203504385910493847342162808976418130529667013116709567801130631640988744e-160");
yield return new("random-058", 6246484989.905359, 2.384185791015625e-07, -16.2711731368527, 8.881784197001252e-16, true, "4.10691323776987662179252699499233854373420509857239962608004348118744058498900950727749833053441074465750716495544339819e-160");
yield return new("random-059", 7.755259330301604e+71, 2.4519928653854222e+55, -4.390182549856692, -2.220446049250313e-16, false, "2.46347805705120599234476223916224083866641095321893187649797616530246700833807653254249675540723278848667968994116727679e-316");
yield return new("random-059", 7.755259330301604e+71, 2.4519928653854222e+55, -4.390182549856692, -2.220446049250313e-16, true, "2.46347805705129653863412206917119470982114581867456795725336673887396704141275177084768513035407527648408337003165316685e-316");
yield return new("random-060", 9.426572367306395e+249, -3.974446316289815e+233, -0.8322001274026575, 2.7755575615628914e-17, false, "9.36075579207453934058909632876794149345779573499381868775168803708656445625533000980585049062486411442838682214380445499e-209");
yield return new("random-060", 9.426572367306395e+249, -3.974446316289815e+233, -0.8322001274026575, 2.7755575615628914e-17, true, "9.36075579207438979545143279794823468179579990887232311742043826258574408330475478066118368542596926813658507808837862961e-209");
yield return new("random-061", 6.665338145434483e+27, 274877906944.0, -2.6025663238851258, 1.1102230246251565e-16, false, "3.86062283022291959315703521750398787201374022027751825888326187191956385146388108357282408704433848973695604422152869677e-73");
yield return new("random-061", 6.665338145434483e+27, 274877906944.0, -2.6025663238851258, 1.1102230246251565e-16, true, "3.86062283022289213318552395777861277012283586311566297657065116933227482220805859583781882566395616957704503142180190480e-73");
yield return new("random-062", 4.384897356439253e-38, -1.305060893599705e-54, 1.372564308666499, 5.551115123125783e-17, false, "5.29281694814242959266782382700202150280162174657147709907184925488519805587285913611568479442182351761969737960984972041e-52");
yield return new("random-062", 4.384897356439253e-38, -1.305060893599705e-54, 1.372564308666499, 5.551115123125783e-17, true, "5.29281694814245486625494533934748961430714083038031547341325012766129500509664783808973703062619274662179748212358889490e-52");
yield return new("random-063", 3.7694517392051613e-128, -1.2813331809171846e-144, -1.10278759064519, 5.551115123125783e-17, false, "3.32123165679805835779453168969899956334016608735414744966194472963183473077494805700410074395231468951409651629068186771e+140");
yield return new("random-063", 3.7694517392051613e-128, -1.2813331809171846e-144, -1.10278759064519, 5.551115123125783e-17, true, "3.32123165679811245133129004581339084535247121986313243796937734333658112622443698158326398942687626606480552226197869506e+140");
yield return new("random-064", 1.4947898834108077e-86, 4.464794497196387e-103, -0.7744819872517898, 2.7755575615628914e-17, false, "2.95285228545287808416338637963045812203143299816243504259717361565330718051512903617329298559643677121024188948905718633e+66");
yield return new("random-064", 1.4947898834108077e-86, 4.464794497196387e-103, -0.7744819872517898, 2.7755575615628914e-17, true, "2.95285228545289428075328958588211393767601818605103101663489799202475407381680551028066504310045330009550816841735543673e+66");
yield return new("random-065", 4.745244009042245e+213, 1.495020541582441e+197, 1.3846948234580816, -5.551115123125783e-17, false, "7.52331263378927037580327924277321636388604201137963451210471545149773815460703814197985992314495019899158305535680996147e+295");
yield return new("random-065", 4.745244009042245e+213, 1.495020541582441e+197, 1.3846948234580816, -5.551115123125783e-17, true, "7.52331263378947585189799496059981626504201541180445068459718851928543506211210904325975278354286814001745520333944881136e+295");
yield return new("random-066", 6.440652706609978e+114, -2.734063405978765e+98, -2.183073065882722, 1.1102230246251565e-16, false, "2.31056107332946939748706406533914985579308968748078533326110901309080860026291026124848220429455640667391555283265916471e-251");
yield return new("random-066", 6.440652706609978e+114, -2.734063405978765e+98, -2.183073065882722, 1.1102230246251565e-16, true, "2.31056107332940158353735556383999650008297467610359696601264395755020871537180986550801667482464325041820817951991823434e-251");
yield return new("random-067", 1.5421293190785145e+177, -5.623642243178996e+160, 1.7059738594258969, 5.551115123125783e-17, false, "1.89802651663648270633146861194640876608583932519582159764820678948045630966337859369988782136476651127277895479504673941e+302");
yield return new("random-067", 1.5421293190785145e+177, -5.623642243178996e+160, 1.7059738594258969, 5.551115123125783e-17, true, "1.89802651663643971976073656565658718706570512201134988865411231080606269703416011055755658369950022167973852738281281810e+302");
yield return new("random-068", 5.8220874333356594e+262, 1.7479799754928565e+246, -0.1436354933081326, -6.938893903907228e-18, false, "1.80970711328589879663386591268389271129701476677165044171592945226658709885936201784587819291324001864972363019827021764e-38");
yield return new("random-068", 5.8220874333356594e+262, 1.7479799754928565e+246, -0.1436354933081326, -6.938893903907228e-18, true, "1.80970711328590639432923785607775150676710262348136279472066300472232706370799956381214985003441558456663302621636959907e-38");
yield return new("random-069", 3.795476967093157e-88, 1.3952482803738708e-104, 0.053268715081224695, -1.734723475976807e-18, false, "2.20399115636242053910063422114565083516041070189337487461666141997781058498644743162943371074270870677703994500613867432e-5");
yield return new("random-069", 3.795476967093157e-88, 1.3952482803738708e-104, 0.053268715081224695, -1.734723475976807e-18, true, "2.20399115636241976949145512992018390854890108322062813166387111232921706791864523542840306644575437106284519714106007185e-5");
yield return new("random-070", 3.209842165726736e-252, 1.2114454386347773e-268, 0.8412215239629043, 2.7755575615628914e-17, false, "2.74309553137947785261927662259300329934972410834860453995250796933986465542356217908480219205451660846022678403342537975e-212");
yield return new("random-070", 3.209842165726736e-252, 1.2114454386347773e-268, 0.8412215239629043, 2.7755575615628914e-17, true, "2.74309553137952194196489117707347144500183668022415671260147636890498538026072816453087950124578550529972409423544042399e-212");
yield return new("random-071", 5.311293695850351e+66, -1.8707220957835557e+50, 0.13580452267811036, 6.938893903907228e-18, false, "1.15234886833614943584588526132877832029753936838559712190903106025423634791904649252113922198361325564401124095946434289e+9");
yield return new("random-071", 5.311293695850351e+66, -1.8707220957835557e+50, 0.13580452267811036, 6.938893903907228e-18, true, "1.15234886833614820733275719125572301067566717317432469584539846785607006474925388274936611479816831298073711186377569250e+9");
yield return new("random-072", 6.43467707682675e+244, -3.032261899024822e+228, 0.8480205479733094, -2.7755575615628914e-17, false, "4.00553940789149805574303019973106270292162919846604196005670293684083357849141768212511459507762285255683906692411942024e+207");
yield return new("random-072", 6.43467707682675e+244, -3.032261899024822e+228, 0.8480205479733094, -2.7755575615628914e-17, true, "4.00553940789156072484571184212030858206061978906306950038298140246710282449694410485862277539275502594050960697844857090e+207");
yield return new("random-073", 5.311994532854108e-164, -1.9279358920823073e-180, -0.2618265170355586, 1.3877787807814457e-17, false, "5.61897522724294008667002902755921525760123685290100011097787221826160318134722270467270841199399301922877576840183057935e+42");
yield return new("random-073", 5.311994532854108e-164, -1.9279358920823073e-180, -0.2618265170355586, 1.3877787807814457e-17, true, "5.61897522724296940316571027239855999292545785544317478265637491364395394581601863830302326443470817075734509327995617598e+42");
yield return new("random-074", 3.4852179974127304e-261, -1.1282464849155185e-277, 0.8582999555480384, -2.7755575615628914e-17, false, "2.81259721410635499318218763745872682622628067349386820704393383506911243621132008756063072541589454581084525159390367290e-224");
yield return new("random-074", 3.4852179974127304e-261, -1.1282464849155185e-277, 0.8582999555480384, -2.7755575615628914e-17, true, "2.81259721410630817540532755331563587367212302632543802886051933041267238297160700809798314055655241219320226956997595747e-224");
yield return new("random-075", 2.0310619007659213e+159, 9.755464219737476e+142, -1.0294024767649215, -5.551115123125783e-17, false, "1.01914320144411977932987867016084273242944224948742804119604490178446283699309186168016513308344665064929508914406711810e-164");
yield return new("random-075", 2.0310619007659213e+159, 9.755464219737476e+142, -1.0294024767649215, -5.551115123125783e-17, true, "1.01914320144414053171245900331894187549328343900982266012350220838282229870313265279679418852761251555630769976628058642e-164");
yield return new("random-076", 2.0366934244705878e-223, 9.598059608932038e-240, 0.2583937260923773, 1.3877787807814457e-17, false, "2.87093615173165655302635659684527285238184952293573924140359034674032404783338142467305426124950354346474793967309763558e-58");
yield return new("random-076", 2.0366934244705878e-223, 9.598059608932038e-240, 0.2583937260923773, 1.3877787807814457e-17, true, "2.87093615173167698273984796221576898595599087653528382761900947896987491636993986088429053653307827471625426743575063949e-58");
yield return new("random-077", 5257303252144743.0, -0.25, -0.4944600294246418, -1.3877787807814457e-17, false, "1.68543128184738507418853535902939483659358564830939124660742688624363745825590799726805473491523843246459230740804306275e-8");
yield return new("random-077", 5257303252144743.0, -0.25, -0.4944600294246418, -1.3877787807814457e-17, true, "1.68543128184738592087107349925315540073279608781825724639023280630446881198192003558203684839819823026153328880417935104e-8");
yield return new("random-078", 1.0441305725764862e-63, 3.3735033418337674e-80, 2.4845988560461403, -1.1102230246251565e-16, false, "3.28753400885906766453369781596695943745634920524467212364527920404180385246887252732101243952624511062222929445659399430e-157");
yield return new("random-078", 1.0441305725764862e-63, 3.3735033418337674e-80, 2.4845988560461403, -1.1102230246251565e-16, true, "3.28753400885901473386076265418794437983956400853989085386749792474777671471186564923291898744195134226909052401220739791e-157");
yield return new("random-079", 9.48106196551313e-87, 4.464794497196387e-103, -3.0796495614784773, -1.1102230246251565e-16, false, "8.33939726959010554248451588087864677762994401838479812511986680214240743888496301613850512031007712670658861128177394850e+264");
yield return new("random-079", 9.48106196551313e-87, 4.464794497196387e-103, -3.0796495614784773, -1.1102230246251565e-16, true, "8.33939726958992215238427941083796677883425794023678306530637745569221611731941444363049022892052405157139173324731017747e+264");
yield return new("random-080", 2.3489635376450037e+63, -9.134385233318143e+46, -3.7309166396078353, -1.1102230246251565e-16, false, "3.70291069116515475808179799664121501130670790139407751119381343002356397409581521729989495496781332032753257631078798753e-237");
yield return new("random-080", 2.3489635376450037e+63, -9.134385233318143e+46, -3.7309166396078353, -1.1102230246251565e-16, true, "3.70291069116521474532014097267237368198842681544255677887244599978463025521586849469598068777260609818774078994836030206e-237");
yield return new("random-081", 1.2137936558701321e+299, -4.646927838993072e+282, -0.2958229492321156, -1.3877787807814457e-17, false, "3.34230591850427158556514353835730420602232056488083895170314354753440139445947204892647838822910874600626178399160242051e-89");
yield return new("random-081", 1.2137936558701321e+299, -4.646927838993072e+282, -0.2958229492321156, -1.3877787807814457e-17, true, "3.34230591850430352855181047597751339187455601785112549251015766298918120325364702942999518038642768253707159481039677318e-89");
yield return new("random-082", 9.272552433155036e-45, -3.111507638930571e-61, -6.5463427552871325, -2.220446049250313e-16, false, "1.79393156639960937841831914519656472927078668900576725274930000372538356788720378891316892482778996349309545152375126871e+288");
yield return new("random-082", 9.272552433155036e-45, -3.111507638930571e-61, -6.5463427552871325, -2.220446049250313e-16, true, "1.79393156639956899174368266446667427125078539726064207800612175949777957255479085776779309430835768467545400484448600542e+288");
yield return new("random-083", 3.619484344987589e-118, 1.1006568214637918e-134, -2.4127503790723783, -1.1102230246251565e-16, false, "2.27336771012158793833767345746300405362926260813269092560641715888384724369429389529584384437489499140142581301855291986e+283");
yield return new("random-083", 3.619484344987589e-118, 1.1006568214637918e-134, -2.4127503790723783, -1.1102230246251565e-16, true, "2.27336771012151968613798467761831817119376428649460562215025753295936574304633530687709875130113638035589777732793641575e+283");
yield return new("random-084", 3.1952587166007973e+186, 1.2076679759428932e+170, 1.6108189483802753, 5.551115123125783e-17, false, "2.66067769366225087938578022710008906112238000521547766894525439420835174497812703966483277723008348845690579799400073415e+300");
yield return new("random-084", 3.1952587166007973e+186, 1.2076679759428932e+170, 1.6108189483802753, 5.551115123125783e-17, true, "2.66067769366218745189651349741544510185300078364055454366286362111509995755372593712757614250421188425244688591878256024e+300");
yield return new("random-085", 21644665.146820694, -9.313225746154785e-10, -35.086654716794904, 1.7763568394002505e-15, false, "4.23717836897201559720165922877812320078896799452519679890254265728823497141331056015764391964201571748370536798047898235e-258");
yield return new("random-085", 21644665.146820694, -9.313225746154785e-10, -35.086654716794904, 1.7763568394002505e-15, true, "4.23717836897188846852098906829669052248265056205531951544316957831339826562702793084324765815551596113708418912125474353e-258");
yield return new("random-086", 3.2738469026656067e-15, -9.860761315262648e-32, 21.085112186415408, -8.881784197001252e-16, false, "3.83160419507659873451258968713139863944504991703277047229745058386780954483216138665106311664842755927476726424781820212e-306");
yield return new("random-086", 3.2738469026656067e-15, -9.860761315262648e-32, 21.085112186415408, -8.881784197001252e-16, true, "3.83160419507648522995633464969311936592446563700810273931470621746679108323435904309266176486641455744052070632550196091e-306");
yield return new("random-087", 5.64264218241876e+119, 1.7917957937422434e+103, 0.717333317651494, 2.7755575615628914e-17, false, "7.97495504161643147724334293266993846537810809432954973380389559144217051353292185432388490539250434849628176076416200857e+85");
yield return new("random-087", 5.64264218241876e+119, 1.7917957937422434e+103, 0.717333317651494, 2.7755575615628914e-17, true, "7.97495504161637044278858165706996271937349742034081733517375704900601685075485493435998467791067077059770021671277508401e+85");
yield return new("random-088", 1.6419800233657923e+84, -5.391989333430128e+67, -3.18270921700261, 1.1102230246251565e-16, false, "9.26771072754639495240942166576282444105312988681865203186053689757114315237617914251487387662283020832860797854934556736e-269");
yield return new("random-088", 1.6419800233657923e+84, -5.391989333430128e+67, -3.18270921700261, 1.1102230246251565e-16, true, "9.26771072754619543089236032341209742005613658950941318683260711788747091245610585135881316060777476681634066705535624703e-269");
yield return new("random-089", 6.829219656283384e-234, -2.7934029957198183e-250, -0.758125506205212, 2.7755575615628914e-17, false, "5.87233000359663922816624921670228484500099474206201132054517578510492013245923363335851865804340319072158428837160004016e+176");
yield return new("random-089", 6.829219656283384e-234, -2.7934029957198183e-250, -0.758125506205212, 2.7755575615628914e-17, true, "5.87233000359672673478675048537004104260287376290913156541361324783147955732342364892383518936981561794669398486985054360e+176");
yield return new("random-090", 1.578348182303572e-110, -7.386382894228589e-127, 0.16663603604665617, 6.938893903907228e-18, false, "5.04735400959579327864232849595576310096447817082719627595650426497748903244740079942101463936767470143150619035369441612e-19");
yield return new("random-090", 1.578348182303572e-110, -7.386382894228589e-127, 0.16663603604665617, 6.938893903907228e-18, true, "5.04735400959580213345036511935050795621462318942151341197460150489769628169074935991510785958887253794645322193483154205e-19");
yield return new("random-091", 3.2122152421971364e+31, -1125899906842624.0, -0.9071196814491492, 2.7755575615628914e-17, false, "2.62758886524442797473215842799508256259007616347080009686327081086077812657331969042769494200312032459381725220125595130e-29");
yield return new("random-091", 3.2122152421971364e+31, -1125899906842624.0, -0.9071196814491492, 2.7755575615628914e-17, true, "2.62758886524442268385473558543255090868273753215360847668035509422849914899844332569263964685819852204935110020742806838e-29");
yield return new("random-092", 1.7749918855828154e+51, -8.307674973655724e+34, -0.0530423579382589, -1.734723475976807e-18, false, "1.91258956513967271373457657232007110770016468730757348931369671294545945458114801825426940077565409790548477058775675156e-3");
yield return new("random-092", 1.7749918855828154e+51, -8.307674973655724e+34, -0.0530423579382589, -1.734723475976807e-18, true, "1.91258956513967310525532861507864952770391105222585009689884835774310917436095761695155931835323525244461106484590321773e-3");
yield return new("random-093", 3.2765451290030216e+59, -1.1150372599265312e+43, 2.1569580842122273, -1.1102230246251565e-16, false, "2.35644880357218568926946615487709975341629601933046597129191584398002960626660204178331779285826504388183155382829791891e+128");
yield return new("random-093", 3.2765451290030216e+59, -1.1150372599265312e+43, 2.1569580842122273, -1.1102230246251565e-16, true, "2.35644880357222154127063235317869899640006889121881262979071632362722768029251452078709144629038628434457147640255659879e+128");
yield return new("random-094", 2.0047803527677465e-36, -8.352389719038111e-53, 0.3972434671765325, 1.3877787807814457e-17, false, "6.59521933947450124330362945646442062215706149421706932936792600486590969593216379735183770910588890137513007801538412460e-15");
yield return new("random-094", 2.0047803527677465e-36, -8.352389719038111e-53, 0.3972434671765325, 1.3877787807814457e-17, true, "6.59521933947450876660133483788877634428107696732443726699820322949456864870706982398877725040803958916218050692226893294e-15");
yield return new("random-095", 7.446811474230911e+124, -2.3485425827738332e+108, 0.5407062438043025, 2.7755575615628914e-17, false, "3.30410659183203835612267603767795387679938362667237621025402344138235919880680216614155522176373741923335263749230965562e+67");
yield return new("random-095", 7.446811474230911e+124, -2.3485425827738332e+108, 0.5407062438043025, 2.7755575615628914e-17, true, "3.30410659183201198765206868603944360741303118834805146104764792169176177950577620217880380987316243426581858629788342457e+67");
}
}
@@ -0,0 +1,63 @@
"""Regenerate Exp reference rows using only Python's standard library.
Decimal.exp/ln are correctly rounded. Evaluate exact stored binary64 sums at
180 and 260 digits and require identical 120-digit references and split inputs.
No DD implementation, binary64 exp, or DD-rounded mathematical constants are used.
Run from the repo root; stdout is the body of ExpReferenceData.Cases.
"""
from decimal import Decimal, localcontext
import math
import random
def generate(precision):
with localcontext() as context:
context.prec = precision
two = Decimal(2)
ln2 = two.ln()
high_ln2 = float(ln2)
low_ln2 = float(ln2 - Decimal.from_float(high_ln2))
tail_ln2 = float(ln2 - Decimal.from_float(high_ln2) - Decimal.from_float(low_ln2))
inputs = [(x, 0.0) for x in [1.0, -1.0, 0.5, -0.5, 709.5, 709.781, -740.0,
-745.131, 710.0, -746.0, 1e-30, -1e-30, 5e-324, -5e-324]]
for high in [1.0, -1.0, 0.5, -0.5, 709.5, -740.0]:
for low in [math.ulp(high) / 4, -math.ulp(high) / 4, 5e-324, -5e-324]:
inputs.append((high, low))
rng = random.Random(271828)
for _ in range(240):
high = rng.uniform(-745, 709.78)
inputs.append((high, rng.choice([-1, 0, 1]) * math.ulp(high) / 4))
# Neighbors of binary range-reduction half steps, covering both signs of k.
for k in [-1074, -1022, -100, -1, 0, 1, 100, 1023]:
midpoint = (Decimal(k) + Decimal('0.5')) * ln2
high = float(midpoint)
low = float(midpoint - Decimal.from_float(high))
inputs.extend((high, residual) for residual in [math.nextafter(low, -math.inf), low, math.nextafter(low, math.inf)])
# Adjacent representable low components straddling true overflow and
# half-minimum-subnormal thresholds. Min-normal neighbors pin gradual underflow.
for boundary in [(two ** 1024 - two ** 970).ln(), -1075 * ln2, -1022 * ln2]:
high = float(boundary)
low = float(boundary - Decimal.from_float(high))
inputs.extend((high, residual) for residual in [math.nextafter(low, -math.inf), low, math.nextafter(low, math.inf)])
rows = []
for high, low in inputs:
# 1100 digits preserve even a minimum-subnormal low beside these
# bounded highs. Decimal.exp consumes this exact input before rounding.
with localcontext() as input_context:
input_context.prec = 1100
exact = Decimal.from_float(high) + Decimal.from_float(low)
result = exact.exp()
overflow = result >= two ** 1024 - two ** 970
underflow = result <= two ** -1075
with localcontext() as output_context:
output_context.prec = 120
reference = format(+result, 'e')
rows.append(f' yield return new({high!r}, {low!r}, "{reference}", {str(overflow).lower()}, {str(underflow).lower()});')
return tail_ln2, rows
if __name__ == '__main__':
first = generate(180)
assert first == generate(260), 'References changed with increased precision'
print(f'// ln(2) third component: {first[0]!r}')
print('\n'.join(first[1]))
@@ -0,0 +1,110 @@
"""Generate Log fixtures independently with Python's standard library.
Run from any directory: python3 path/to/generate_log.py [--check].
Construct exact binary64 component sums at 2200 decimal digits, verify against
Fraction, and require identical 120-digit Decimal.ln references at 450/650 digits.
The C# suite also multiplies the independent ln(2) reference by integer exponents
using BigInteger to check powers of two across every binary64 input exponent.
"""
from decimal import Decimal, localcontext
from fractions import Fraction
from pathlib import Path
import argparse
import math
import random
import sys
OUTPUT = Path(__file__).with_name('LogReferenceData.cs')
def exact_sum(high, low):
with localcontext() as context:
context.prec = 2200
result = Decimal.from_float(high) + Decimal.from_float(low)
assert Fraction(result) == Fraction(high) + Fraction(low), (high, low)
return result
def reference(high, low, precision):
value = exact_sum(high, low)
assert value > 0
with localcontext() as context:
context.prec = precision
result = value.ln()
with localcontext() as output_context:
output_context.prec = 120
rounded = +result
assert abs(result - rounded) <= abs(rounded) * Decimal(2) ** -350
return format(rounded, 'e')
def inputs():
for high in [0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0, 10.0, 1e-308, 1e308,
sys.float_info.max, sys.float_info.min, math.ulp(0.0),
3 * math.ulp(0.0), math.nextafter(sys.float_info.min, 0.0),
math.nextafter(sys.float_info.min, math.inf),
math.nextafter(1.0, 0.0), math.nextafter(1.0, math.inf)]:
yield 'scalar-boundary', high, 0.0
for scale in [-1074, -1073, -1022, -1000, -500, -1, 0, 1, 500, 1000, 1023]:
high = math.ldexp(1.5, scale)
for low in [math.ulp(high) / 4, -math.ulp(high) / 4]:
yield 'binade-residual', high, low
for high in [1.0, math.sqrt(2), 1 / math.sqrt(2), 1e-308, 1e308, sys.float_info.max]:
for low in [math.ulp(high) / 4, -math.ulp(high) / 4, math.ulp(0.0), -math.ulp(0.0)]:
yield 'dense-and-sparse-low', high, low
# Same high with adjacent lows crosses the tiny-delta kernel cutoff.
for low in [2.0 ** -54, -2.0 ** -54]:
for neighbor in [math.nextafter(low, -math.inf), low, math.nextafter(low, math.inf)]:
yield 'tiny-delta-transition', 1.0, neighbor
for scale in [-53, -54, -55, -100, -500, -1000, -1022, -1073, -1074]:
for sign in [-1, 1]:
yield 'near-one-log', 1.0, sign * 2.0 ** scale
# Centering transitions in both high and low, far from x=1 cancellation.
for high in [math.sqrt(2), 1 / math.sqrt(2)]:
for neighbor in [math.nextafter(high, 0.0), high, math.nextafter(high, math.inf)]:
for low in [math.ulp(neighbor) / 4, -math.ulp(neighbor) / 4]:
yield 'centering-transition', neighbor, low
rng = random.Random(3141592)
for index in range(256):
high = math.ldexp(rng.uniform(1.0, 1.999), rng.randint(-1074, 1023))
yield f'random-{index:03}', high, rng.choice([-1, 0, 1]) * math.ulp(high) / 4
def generate():
ln2 = reference(2.0, 0.0, 450)
assert ln2 == reference(2.0, 0.0, 650)
rows = []
for label, high, low in inputs():
first = reference(high, low, 450)
assert first == reference(high, low, 650), (label, high, low)
rows.append(f' yield return new("{label}", {high!r}, {low!r}, "{first}");')
content = '''// Generated by generate_log.py; do not hand-edit reference literals.
// Exact binary64 sums; Decimal.ln at 450/650 digits, rounded to 120 digits.
using Xunit;
namespace Just.PreciseMath.Tests.ReferenceData;
internal static class LogReferenceData
{
''' + f' internal const string Ln2 = "{ln2}";\n\n' + ''' internal static IEnumerable<TheoryDataRow<string, double, double, string>> Cases()
{
''' + '\n'.join(rows) + '\n }\n}\n'
return content, len(rows)
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--check', action='store_true', help='Verify fixtures without writing')
args = parser.parse_args()
content, count = generate()
if args.check:
assert OUTPUT.read_text() == content, 'Fixture is stale; regenerate it'
print(f'Verified {count} Log references and ln(2) at 450/650 digits with exact input sums.')
else:
OUTPUT.write_text(content)
print(f'Generated {count} Log references in {OUTPUT.name}.')
if __name__ == '__main__':
main()
@@ -0,0 +1,43 @@
#!/usr/bin/env python3
"""Generate integer Pow fixtures independently with Python's stdlib Decimal.
Use exact binary64 components, then Decimal integer exponentiation at 160 and
240 significant decimal digits. Retain only rows whose floor after multiplication
by 10**100 agrees at both precisions. Tests check both ends of the resulting
100-decimal-place reference interval, far tighter than their DD error tolerance.
No Python or generated data is needed when running the .NET tests.
"""
from decimal import Decimal, localcontext, ROUND_FLOOR
import math
def reference(high, low, exponent, precision):
with localcontext() as context:
context.prec = precision
value = Decimal.from_float(high) + Decimal.from_float(low)
result = context.power(value, exponent)
return int((result * (Decimal(10) ** 100)).to_integral_value(rounding=ROUND_FLOOR))
def main():
inputs = [
(1.0, math.ldexp(1.0, -54)),
(1.0, -math.ldexp(1.0, -54)),
(1.0 + math.ldexp(1.0, -30), math.ldexp(1.0, -84)),
(1.0 - math.ldexp(1.0, -30), -math.ldexp(1.0, -84)),
(1.00000003, math.ldexp(1.0, -55)),
]
for high, low in inputs:
for exponent in [-2147483648, 2147483647]:
first = reference(high, low, exponent, 160)
second = reference(high, low, exponent, 240)
assert first == second, (high, low, exponent)
# Very tiny results need a relative rather than fixed-place interval;
# these rows instead exercise the large positive-power fixture.
if first == 0:
continue
print(f' [InlineData({high!r}, {low!r}, {exponent}, "{first}")]')
if __name__ == "__main__":
main()
@@ -0,0 +1,151 @@
"""Independent finite Pow fixtures; Python standard library only.
Run from any directory: python3 path/to/generate_real_pow.py [--check].
Build each binary64 component sum EXACTLY at 2200 decimal digits and verify
against Fraction. Decimal.ln/exp evaluate at 450 and 650 digits; the rounded
120-significant-digit references must agree. Even 1 +/- 2^-1074 is retained
before logarithm evaluation, so huge exponents can amplify sparse corrections.
No library-under-test operations or binary64 Pow supply expected values.
Each scalar case discards exponent low BEFORE independently evaluating its oracle.
"""
from decimal import Decimal, localcontext
from fractions import Fraction
from pathlib import Path
import argparse
import math
import random
import sys
OUTPUT = Path(__file__).with_name('RealPowReferenceData.cs')
def exact_sum(high, low):
with localcontext() as context:
context.prec = 2200
result = Decimal.from_float(high) + Decimal.from_float(low)
assert Fraction(result) == Fraction(high) + Fraction(low), (high, low)
return result
def inputs():
# (label, base high, base low, exponent high, exponent low).
rows = []
for high in [0.125, 0.5, 1.25, 2.0, 10.0, 1e-308, 1e308,
sys.float_info.max, sys.float_info.min, math.ulp(0.0),
3 * math.ulp(0.0), math.nextafter(sys.float_info.min, 0.0)]:
for power in [0.5, -0.5, 0.25, -0.25]:
rows.append(('magnitude-fractional', high, 0.0, power, 0.0))
for high in [0.75, 1.25, 2.0, 10.0, 1e-300, 1e300]:
for sign in [-1, 1]:
rows.append(('both-residuals', high, sign * math.ulp(high) / 4,
-0.75, -sign * math.ulp(0.75) / 4))
for low in [2.0 ** -54, -2.0 ** -54, 1e-300, -1e-300, 1e-308, -1e-308,
math.ulp(0.0), -math.ulp(0.0)]:
powers = [1e16, -1e16] if abs(low) > 1e-100 else [1e300, -1e300]
if abs(low) < 1e-307:
powers.extend([sys.float_info.max, -sys.float_info.max])
for power in powers:
for exponent_low in [0.0, math.ulp(power) / 4]:
rows.append(('near-one-amplification', 1.0, low, power, exponent_low))
# Tiny deltas on both sides of likely sparse-kernel cutoffs.
for scale in [-26, -27, -40, -53, -100, -500, -1000, -1022, -1073]:
for sign in [-1, 1]:
rows.append(('sparse-scale-sweep', 1.0, sign * 2.0 ** scale,
math.ldexp(0.75, min(-scale, 1023)), 0.125))
# Nonzero exponent lows distinguish DD from scalar, including high integers.
for high in [2.0, 10.0, 1e308, 1e-308]:
for power, low in [(1.0, 2.0 ** -54), (-1.0, -2.0 ** -54),
(0.0, math.ulp(0.0)), (0.5, 2.0 ** -55)]:
rows.append(('exponent-low-decisive', high, 0.0, power, low))
for power in [float(-(2 ** 31)), float(2 ** 31 - 1), float(2 ** 31),
float(-(2 ** 31) - 1), float(2 ** 53), float(2 ** 54)]:
for low in [-0.5, 0.0, 0.5]:
rows.append(('integer-boundary', 1.0, 2.0 ** -54, power, low))
# Exact DD integer parity includes low; scalar has its own (usually even) sign.
for power, low in [(2.0 ** 53, 1.0), (2.0 ** 54, -1.0),
(-2.0 ** 53, -1.0), (2.0 ** 54, 2.0)]:
rows.append(('negative-integral-low-parity', -1.0, -2.0 ** -54, power, low))
for power in [-63.0, -7.0, 7.0, 63.0]:
rows.append(('negative-int-dispatch', -1.25, 2.0 ** -55, power, 0.0))
# Finite range shoulders are far from ambiguous overflow/zero thresholds.
for power in [1023.75, -1021.75, -1073.5, -1074.25]:
rows.append(('finite-range-shoulder', 2.0, 2.0 ** -54, power, 2.0 ** -45))
rng = random.Random(1618033)
for index in range(96):
high = math.ldexp(rng.uniform(1.125, 1.875), rng.randint(-1000, 1000))
low = rng.choice([-1, 1]) * math.ulp(high) / 4
# Binary64 log selects well-separated finite cases, NEVER their references.
target_log = rng.uniform(-740.0, 708.0)
power = target_log / math.log(high)
rows.append((f'random-{index:03}', high, low, power,
rng.choice([-1, 1]) * math.ulp(power) / 4))
return rows
def reference(high, low, power_high, power_low, precision):
base = exact_sum(high, low)
power = exact_sum(power_high, power_low)
sign = 1
if base < 0:
assert power == power.to_integral_value(), (base, power)
sign = -1 if int(power) % 2 else 1
base = base.copy_abs()
with localcontext() as context:
context.prec = precision
result = (base.ln() * power).exp() * sign
# No disputed overflow boundary expectations: leave a large margin.
assert result.copy_abs() < Decimal.from_float(sys.float_info.max) * Decimal('0.999999999999')
with localcontext() as output_context:
output_context.prec = 120
rounded = +result
# Verify a generous 2^-350 reference-relative allowance explicitly.
assert abs(result - rounded) <= abs(rounded) * Decimal(2) ** -350
return format(rounded, 'e')
def generate():
rows = []
references = 0
for label, high, low, power, power_low in inputs():
for scalar in [False, True]:
oracle_low = 0.0 if scalar else power_low
first = reference(high, low, power, oracle_low, 450)
assert first == reference(high, low, power, oracle_low, 650), (label, scalar)
references += 1
rows.append(f' yield return new("{label}", {high!r}, {low!r}, '
f'{power!r}, {power_low!r}, {str(scalar).lower()}, "{first}");')
content = '''// Generated by generate_real_pow.py; do not hand-edit reference literals.
// Exact binary64 sums; Decimal ln/exp at 450/650 digits, rounded to 120 digits.
// Reference uncertainty is explicitly allowed as 2^-350 relative in the tests.
using Xunit;
namespace Just.PreciseMath.Tests.ReferenceData;
internal static class RealPowReferenceData
{
public static IEnumerable<TheoryDataRow<string, double, double, double, double, bool, string>> Cases()
{
''' + '\n'.join(rows) + '\n }\n}\n'
return content, references
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--check', action='store_true', help='Verify checked-in fixture without writing it')
args = parser.parse_args()
# Sparse input construction sentinels include more than 1000 decimal places.
for high, low in [(1.0, math.ulp(0.0)), (1.0, -math.ulp(0.0)),
(sys.float_info.max, math.ulp(0.0))]:
exact_sum(high, low)
content, count = generate()
if args.check:
assert OUTPUT.read_text() == content, 'Fixture is stale; regenerate it'
print(f'Verified {count} finite references at 450/650 digits and exact component sums.')
else:
OUTPUT.write_text(content)
print(f'Generated {count} finite references in {OUTPUT.name}.')
if __name__ == '__main__':
main()