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
+64
View File
@@ -0,0 +1,64 @@
namespace Just.PreciseMath;
public static partial class DDMath
{
/// <summary>Returns e raised to the specified double-double value.</summary>
/// <remarks>
/// Uses binary range reduction and a [12/12] Padé approximation. Results are
/// approximate, not guaranteed correctly rounded; tests check 2^-100 relative
/// error plus one minimum binary64 subnormal against high-precision references.
/// Precision decreases near underflow. NaN returns canonical NaN; positive
/// infinity returns positive infinity, negative infinity returns positive zero,
/// and either zero returns one. Both input components affect range boundaries.
/// </remarks>
[Pure]
public static DoubleDouble Exp(DoubleDouble value)
{
if (double.IsNaN(value.High))
{
return DoubleDouble.NaN;
}
// These deliberately loose bounds only reject inputs safely outside the
// result range, even with a normalized low of either sign. They also keep
// infinities and huge finite inputs out of the floating-to-int conversion.
if (value.High > 710.0)
{
return new DoubleDouble(double.PositiveInfinity);
}
if (value.High < -746.0)
{
return DoubleDouble.Zero;
}
if (value.High == 0.0)
{
return DoubleDouble.One;
}
// The binary64 estimate need not choose the nearest k on a tie: either
// neighbor leaves |r| < 0.347. k is bounded by [-1076, 1024]. Subtract
// separate products to retain cancellation residuals. A third ln(2)
// component prevents k times the DD constant error from dominating r.
// Generated independently at 180/260 decimal digits by generate_exp.py.
const double ln2Tail = 5.707708438416212e-34;
int exponent = (int)Math.Round(value.High / DoubleDouble.Ln2.High);
DoubleDouble reduced = value - (new DoubleDouble(DoubleDouble.Ln2.High) * exponent);
reduced -= new DoubleDouble(DoubleDouble.Ln2.Low) * exponent;
reduced -= new DoubleDouble(ln2Tail) * exponent;
// P(x)/P(-x), with exact binary64 integer coefficients. For n=12,
// c_k = (24-k)!*12! / (24!*k!*(12-k)!), scaled by 1/c_12.
// This retains the legacy approximation but not its unsafe E^k scaling.
// Horner accumulators remain normal and finite on the reduced interval.
ReadOnlySpan<double> coefficients = [156.0, 12012.0, 600600.0, 21621600.0,
588107520.0, 12350257920.0, 201132771840.0, 2514159648000.0,
23465490048000.0, 154872234316800.0, 647647525324800.0, 1295295050649600.0];
DoubleDouble numerator = DoubleDouble.One;
DoubleDouble denominator = DoubleDouble.One;
foreach (double coefficient in coefficients)
{
numerator = (numerator * reduced) + coefficient;
denominator = (denominator * -reduced) + coefficient;
}
return ScalePowerOfTwo(numerator / denominator, exponent);
}
}
+77
View File
@@ -0,0 +1,77 @@
namespace Just.PreciseMath;
public static partial class DDMath
{
/// <summary>Returns the natural logarithm of a double-double value.</summary>
/// <remarks>
/// Either signed zero returns negative infinity; one returns positive zero.
/// Positive infinity is preserved. Negative nonzero values and NaN return
/// canonical NaN. Both input components contribute to the finite result.
/// Uses binary range reduction and an atanh series, with a separate near-one
/// path that preserves sparse low components. Results are approximate, not
/// guaranteed correctly rounded: tests check 2^-100 relative error plus one
/// minimum binary64 subnormal against independent high-precision references.
/// </remarks>
[Pure]
public static DoubleDouble Log(DoubleDouble value)
{
if (double.IsNaN(value.High) || value.High < 0.0)
{
return DoubleDouble.NaN;
}
if (value.High == 0.0)
{
return new DoubleDouble(double.NegativeInfinity);
}
if (double.IsPositiveInfinity(value.High))
{
return value;
}
if (value == DoubleDouble.One)
{
return DoubleDouble.Zero;
}
return LogPositiveFinite(value);
}
// Shared with Pow. Requires a positive finite normalized value other than one;
// callers handle domain errors and special values before any range reduction.
private static DoubleDouble LogPositiveFinite(DoubleDouble value)
{
if (value.High == 1.0 && Math.Abs(value.Low) <= Math.ScaleB(1.0, -54))
{
// log(1+d) = d - d^2/2 + O(d^3). The omitted relative term is
// below 2^-108. Keep d itself, rather than forming d/(2+d), which
// could round a minimum-subnormal low to zero before a huge power
// amplifies it. Underflow of d^2 is immaterial to the relative bound.
DoubleDouble delta = new(value.Low);
return delta - ((delta * delta) * 0.5);
}
int exponent = Math.ILogB(value.High);
DoubleDouble mantissa = DoubleDouble.FromComponents(Math.ScaleB(value.High, -exponent),
Math.ScaleB(value.Low, -exponent));
if (mantissa.High > DoubleDouble.Sqrt2.High)
{
mantissa *= 0.5;
++exponent;
}
// The mantissa is approximately in [1/sqrt(2), sqrt(2)], so
// |t| = |(m-1)/(m+1)| < 0.172. Centering at one avoids cancellation
// between log(m) and exponent*ln(2) for inputs immediately below one.
// All unscaled sums are bounded: m+1 cannot overflow at large inputs.
DoubleDouble t = (mantissa - 1.0) / (mantissa + 1.0);
DoubleDouble squared = t * t;
DoubleDouble term = t;
DoubleDouble sum = t;
for (int denominator = 3; denominator <= 49; denominator += 2)
{
term *= squared;
sum += term / denominator;
}
// log(m) = 2*atanh(t). The omitted series tail is bounded by
// 2*|t|^51/(51*(1-t^2)); rounding, not truncation, dominates.
return (sum * 2.0) + (DoubleDouble.Ln2 * exponent);
}
}
+164
View File
@@ -0,0 +1,164 @@
namespace Just.PreciseMath;
public static partial class DDMath
{
/// <summary>Raises a double-double value to an integer power.</summary>
/// <remarks>
/// Uses exponentiation by squaring with a separately tracked binary exponent,
/// so negative powers do not overflow or underflow before reciprocation. All
/// integer exponents, including <see cref="int.MinValue"/>, are supported.
/// Any value to power zero is one, including NaN and either zero. Otherwise
/// NaN propagates; zero and infinity follow binary64 integer-power sign rules.
/// Results are approximate, not guaranteed correctly rounded. Error can grow
/// with the exponent magnitude; the tested absolute error bound for finite
/// results is |exact result| * (|exponent| + 1) * 2^-100 + 2^-1074.
/// This is not a uniform 2^-100 relative accuracy claim or a proof for every
/// input. Precision decreases near underflow, and results extremely close to
/// overflow or underflow rounding boundaries can be affected by approximation.
/// </remarks>
[Pure]
public static DoubleDouble Pow(DoubleDouble value, int exponent)
{
if (exponent == 0)
{
return DoubleDouble.One;
}
if (double.IsNaN(value.High))
{
return DoubleDouble.NaN;
}
if (exponent == 1)
{
// Even a low thousands of bits below high must survive the identity.
return value;
}
bool negative = double.IsNegative(value.High) && (exponent & 1) != 0;
if (value.High == 0.0 || double.IsInfinity(value.High))
{
bool infinite = (value.High == 0.0) == (exponent < 0);
double magnitude = infinite ? double.PositiveInfinity : 0.0;
return new DoubleDouble(negative ? -magnitude : magnitude);
}
// Widen BEFORE negation: abs(int.MinValue) is not an int.
long remaining = exponent < 0 ? -(long)exponent : exponent;
long factorExponent = Math.ILogB(value.High);
DoubleDouble factor = DoubleDouble.FromComponents(
Math.ScaleB(Math.Abs(value.High), -(int)factorExponent),
Math.ScaleB(value.High < 0.0 ? -value.Low : value.Low, -(int)factorExponent));
DoubleDouble result = DoubleDouble.One;
long resultExponent = 0;
while (remaining != 0)
{
if ((remaining & 1) != 0)
{
result *= factor;
resultExponent += factorExponent;
result = NormalizePowerMantissa(result, ref resultExponent);
}
remaining >>= 1;
if (remaining != 0)
{
factor *= factor;
factorExponent *= 2;
factor = NormalizePowerMantissa(factor, ref factorExponent);
}
}
if (exponent < 0)
{
// Reciprocate the bounded significand, NOT the range-limited result.
result = DoubleDouble.One / result;
resultExponent = -resultExponent;
}
return ScalePowerOfTwo(negative ? -result : result, resultExponent);
}
/// <summary>Raises a double-double value to a binary64 power.</summary>
/// <remarks>
/// Promotes the exponent exactly to a zero-low expansion and uses the same
/// domain, special-value, and accuracy rules as <see cref="Pow(DoubleDouble, DoubleDouble)"/>.
/// The base retains both components.
/// </remarks>
[Pure]
public static DoubleDouble Pow(DoubleDouble value, double exponent)
{
return Pow(value, new DoubleDouble(exponent));
}
/// <summary>Raises a double-double value to a double-double power.</summary>
/// <remarks>
/// Both exponent components determine integrality and parity. For finite
/// exponents, negative finite bases require an integer exponent; otherwise
/// the result is canonical NaN.
/// Any base to either zero power is one, and positive one to any power is one,
/// including NaN. Other NaNs propagate. Infinite exponents compare the complete
/// base magnitude with one; either unit magnitude to infinite power is one.
/// Zero and infinite bases have a negative result only for odd integer powers;
/// negative powers exchange zero and infinity. Integral exponents within the
/// int range reuse <see cref="Pow(DoubleDouble, int)"/> and its accuracy contract.
/// Other finite cases use a scaled logarithm and <see cref="Exp"/>, tested
/// against 2^-90 relative error plus one minimum binary64 subnormal with
/// independent high-precision references. This is a tested bound, not a
/// universal proof or correct-rounding guarantee. Precision decreases near
/// underflow, and approximation can affect exceptionally close range boundaries.
/// </remarks>
[Pure]
public static DoubleDouble Pow(DoubleDouble value, DoubleDouble exponent)
{
if (DoubleDouble.IsZero(exponent) || value == DoubleDouble.One)
{
return DoubleDouble.One;
}
if (DoubleDouble.IsNaN(value) || DoubleDouble.IsNaN(exponent))
{
return DoubleDouble.NaN;
}
DoubleDouble magnitude = DoubleDouble.Abs(value);
if (DoubleDouble.IsInfinity(exponent))
{
if (magnitude == DoubleDouble.One)
{
return DoubleDouble.One;
}
bool grows = (magnitude > DoubleDouble.One) == (exponent.High > 0.0);
return grows ? new DoubleDouble(double.PositiveInfinity) : DoubleDouble.Zero;
}
bool integer = DoubleDouble.IsInteger(exponent);
if (integer && exponent.High >= int.MinValue && exponent.High <= int.MaxValue)
{
// A normalized integer in this range has a zero low component.
// Reuse the integer algorithm, including exact identities and ties.
return Pow(value, (int)exponent.High);
}
bool negative = double.IsNegative(value.High) && DoubleDouble.IsOddInteger(exponent);
if (value.High == 0.0 || DoubleDouble.IsInfinity(value))
{
bool infinite = (value.High == 0.0) == (exponent.High < 0.0);
double result = infinite ? double.PositiveInfinity : 0.0;
return new DoubleDouble(negative ? -result : result);
}
if (value.High < 0.0 && !integer)
{
return DoubleDouble.NaN;
}
if (magnitude == DoubleDouble.One)
{
return negative ? DoubleDouble.NegativeOne : DoubleDouble.One;
}
DoubleDouble resultMagnitude = Exp(exponent * LogPositiveFinite(magnitude));
return negative ? -resultMagnitude : resultMagnitude;
}
private static DoubleDouble NormalizePowerMantissa(DoubleDouble value, ref long exponent)
{
// High is positive and in [1, 4], including a rounded binade endpoint.
// Both multiply operands stay modest; a long safely tracks even
// int.MinValue times any finite input's binary64 exponent.
int adjustment = Math.ILogB(value.High);
exponent += adjustment;
return DoubleDouble.FromComponents(Math.ScaleB(value.High, -adjustment),
Math.ScaleB(value.Low, -adjustment));
}
}
+26 -1
View File
@@ -2,7 +2,7 @@ namespace Just.PreciseMath;
/// <summary>Provides mathematical functions for normalized double-double values.</summary>
/// <remarks>Results use fixed-size double-double precision, not arbitrary precision.</remarks>
public static class DDMath
public static partial class DDMath
{
/// <summary>Returns the absolute value without discarding the low component.</summary>
/// <remarks>Both signs of zero become positive zero; NaN is canonicalized and either infinity becomes positive infinity.</remarks>
@@ -54,4 +54,29 @@ public static class DDMath
int rootExponent = exponent / 2;
return DoubleDouble.FromComponents(Math.ScaleB(root.High, rootExponent), Math.ScaleB(root.Low, rootExponent));
}
// For finite, nonzero normalized significands and exponents bounded by the
// integer-power domain (|exponent| < 2^42). Keep the exponent separate until
// the final result so an intermediate cannot overflow before reciprocation.
private static DoubleDouble ScalePowerOfTwo(DoubleDouble value, long exponent)
{
long resultExponent = Math.ILogB(value.High) + exponent;
if (resultExponent > 1024)
{
return new DoubleDouble(Math.CopySign(double.PositiveInfinity, value.High));
}
if (resultExponent < -1075)
{
return new DoubleDouble(Math.CopySign(0.0, value.High));
}
if (resultExponent >= -969 && resultExponent <= 1022)
{
// Normal high and room for a dense low; a sparse low may underflow
// by at most half a minimum subnormal. Normalize its signed zero.
return DoubleDouble.FromComponents(Math.ScaleB(value.High, (int)exponent),
Math.ScaleB(value.Low, (int)exponent));
}
return PreciseMathHelper.ScalePowerOfTwoBoundary(value, exponent);
}
}
+30 -7
View File
@@ -182,13 +182,6 @@ internal static class PreciseMathHelper
return ArithmeticFromRatio(ArithmeticUnits(left) + ArithmeticUnits(right), BigInteger.One << 1074);
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static DoubleDouble AddScalarBoundary(double high, double low, double value)
{
// As in AddScalar, high/low are normalized but a negated zero low is allowed.
return ArithmeticFromRatio(ArithmeticUnits(high) + ArithmeticUnits(low) + ArithmeticUnits(value), BigInteger.One << 1074);
}
[MethodImpl(MethodImplOptions.NoInlining)]
internal static DoubleDouble MultiplyBoundary(DoubleDouble left, DoubleDouble right)
{
@@ -219,6 +212,29 @@ internal static class PreciseMathHelper
return ArithmeticFromRatio(ArithmeticUnits(left), ArithmeticUnits(right));
}
// The caller supplies a finite, nonzero normalized value and has bounded
// ILogB(value.High) + exponent to [-1075, 1024], keeping both shifts small.
// Isolate all allocating setup from ordinary scaling, including conversion
// to integer units and construction of the denominator.
[MethodImpl(MethodImplOptions.NoInlining)]
internal static DoubleDouble ScalePowerOfTwoBoundary(DoubleDouble value, long exponent)
{
// Scale the complete expansion exactly at either exponent boundary.
// Scaling the high first could overflow despite a negative low, or round
// a subnormal tie the wrong way before the low is taken into account.
BigInteger numerator = ArithmeticUnits(value);
BigInteger denominator = BigInteger.One << 1074;
if (exponent >= 0)
{
numerator <<= (int)exponent;
}
else
{
denominator <<= (int)-exponent;
}
return ArithmeticFromRatio(numerator, denominator);
}
// The boundary path uses bounded binary integers (at most about 4200 bits), not
// arbitrary-precision storage. It avoids overflow and double rounding in EFTs
// at the binary64 exponent limits. The common path remains allocation-free.
@@ -266,6 +282,13 @@ internal static class PreciseMathHelper
return DoubleDouble.FromComponents(high, low);
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static DoubleDouble AddScalarBoundary(double high, double low, double value)
{
// As in AddScalar, high/low are normalized but a negated zero low is allowed.
return ArithmeticFromRatio(ArithmeticUnits(high) + ArithmeticUnits(low) + ArithmeticUnits(value), BigInteger.One << 1074);
}
// Round an exact rational to binary64, ties-to-even, including subnormal and
// overflow boundaries. Denominator is positive; sign is retained on underflow.
private static double ArithmeticRound(BigInteger numerator, BigInteger denominator)
@@ -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()
+70 -4
View File
@@ -75,11 +75,11 @@ DoubleDouble quarterTurn = DoubleDouble.PiOver2;
The factors avoid deriving constants at runtime; the multiplication itself remains
approximate DD arithmetic, so conversions are not guaranteed exact round trips.
The list is mathematical and dimensionless, not a table of unit-dependent physical
constants. Precomputed logarithms do not imply a general `Log` function is implemented.
constants. The natural logarithm function is provided separately by `DDMath.Log`.
## Mathematical functions
The initial `DDMath` static class provides:
The `DDMath` static class provides:
- `Abs(DoubleDouble)`: preserves both components, maps either signed zero to
positive zero and either infinity to positive infinity, and returns canonical NaN.
@@ -88,12 +88,40 @@ The initial `DDMath` static class provides:
to retain extended precision, including for subnormal inputs, without squaring
an unscaled estimate near the exponent limits. Signed zero and positive infinity
are preserved; negative nonzero inputs and NaN return canonical NaN.
- `Pow(DoubleDouble, int)`: exponentiation by squaring with a separately tracked
binary exponent. Supports the full `int` domain, including `int.MinValue`, and
reciprocates a bounded significand before final scaling for negative exponents.
Any value to power zero is one (including NaN and signed zero). Other NaNs
propagate; zero/infinity signs follow integer-power parity and exponent sign.
- `Pow(DoubleDouble, double)` and `Pow(DoubleDouble, DoubleDouble)`: arbitrary
real powers, retaining the base's low component and, for the DD overload, the
exponent's low component. For finite exponents, negative finite bases require integers;
integrality and odd/even parity use the complete exponent, even above `2^53`.
Integer-valued exponents within `int` range reuse the integer implementation.
Other finite cases share `Log`'s range-scaled finite kernel, followed by `Exp`.
Near-one bases retain tiny low components before multiplication by large powers.
- `Exp(DoubleDouble)`: binary range reduction with three components of `ln(2)`,
followed by a [12/12] Padé approximation and power-of-two scaling. Both input
components affect range boundaries; representable subnormals are retained.
Either zero maps to one, negative infinity to positive zero, positive infinity
to positive infinity, and NaN to canonical NaN.
- `Log(DoubleDouble)`: natural logarithm using binary range reduction and a
centered atanh series. The bounded mantissa avoids denominator overflow for
large inputs; a separate near-one path retains even minimum-subnormal low
components. Either zero maps to negative infinity, one to positive zero,
positive infinity to itself, and negative nonzero inputs or NaN to canonical NaN.
```csharp
using Just.PreciseMath;
DoubleDouble root = DDMath.Sqrt(new DoubleDouble(2.0));
DoubleDouble magnitude = DDMath.Abs(-root);
DoubleDouble smallPower = DDMath.Pow(new DoubleDouble(2.0), -1024);
DoubleDouble exponential = DDMath.Exp(new DoubleDouble(1.0));
DoubleDouble logarithm = DDMath.Log(new DoubleDouble(10.0));
DoubleDouble fractionalPower = DDMath.Pow(new DoubleDouble(2.0), 0.5);
DoubleDouble preciseExponent = DoubleDouble.FromComponents(0.5, 1e-30);
DoubleDouble precisePower = DDMath.Pow(new DoubleDouble(2.0), preciseExponent);
```
Square-root tests compare the exact component sum against a `2^-100` relative
@@ -102,6 +130,44 @@ exponent, boundary neighbors, both signs of the low component, and exact binary
squares. This is a tested approximate-accuracy contract, not exhaustive coverage
of all component pairs or a guarantee of correctly rounded results.
Logarithm tests compare exact component sums with independently generated
120-digit decimal references, requiring agreement at 450 and 650 digits. They
check `2^-100` relative error plus one minimum binary64 subnormal, with an explicit
reference-rounding allowance. Powers of two cover every finite binary64 exponent;
additional tests cover extreme magnitudes, near-one cancellation, sparse lows of
either sign, and range-reduction transitions. This is sampled approximate accuracy,
not a universal error proof or a correct-rounding guarantee.
Exponential tests use independent high-precision decimal references evaluated at
two precisions, with exact integer comparisons of the stored component sum. They
check `2^-100` relative error plus one minimum binary64 subnormal, with a separately
bounded reference-rounding allowance. Integer-power tests use exact rational
references and high-precision fixtures for large exponents; their tested absolute
error bound is `|exact result| * (|exponent| + 1) * 2^-100 + 2^-1074`, not uniform
relative accuracy independent of the exponent. Both functions are approximate;
precision decreases near underflow and approximation can affect results extremely
close to a rounding boundary. Final scaling uses the existing allocating exact
boundary machinery where necessary. No performance measurements are claimed.
For real powers, `x^±0 = 1` and `1^y = 1`, including NaN in the other operand;
other NaNs propagate. Infinite exponents compare the complete `|x|` with one,
with `(-1)^±∞ = 1`. Zero and infinite bases yield a negative sign only for odd
integer exponents; negative powers exchange zero and infinity. Finite negative
bases with non-integer finite exponents return canonical NaN.
Real-power reference tests check `2^-90` relative error plus one minimum binary64
subnormal for the logarithm/Exp path, with an explicit reference-rounding allowance.
Integer dispatch retains the exponent-dependent bound above. These are tested
approximate-accuracy contracts, not universal error proofs or correct-rounding
guarantees. Reference inputs are exact component sums; logarithms/exponentials
are independently evaluated at 450 and 650 decimal digits.
**Known real-power limitations:** extremely close to the range boundaries, the
logarithm/Exp path can return infinity for a mathematically finite result, or a
minimum subnormal where zero is expected. The latter can also break monotonicity
across integer-exponent dispatch. These issues remain unresolved; passing the
sampled error bounds does not guarantee correct range decisions for every input.
## Conversions and formatting
- Explicit conversions support `double`, `float`, `int`, `long`, and `decimal`
@@ -189,8 +255,8 @@ bool success = DoubleDouble.TryParse("1.25e-2".AsSpan(), CultureInfo.InvariantCu
## Deferred scope
The `DDMath.Pow`, `DDMath.Exp`, and `DDMath.Log` functions remain unimplemented.
Generic-math interfaces beyond `ISignedNumber`,
Natural `DDMath.Log`, `Exp`, and all three `Pow` overloads are implemented.
Logarithms in other bases, generic-math interfaces beyond `ISignedNumber`,
additional text formats/general round-trip formatting, and non-arithmetic performance
benchmarks remain deferred.
Replacing allocating arithmetic boundary fallbacks is also deferred; the current