public static bool[] fcmp(Span <double> lhs, Span <double> rhs, FpCmpMode kind) { var len = length(lhs, rhs); var result = alloc <bool>(len); for (var i = 0; i < len; i++) { result[i] = fcmp(lhs[i], rhs[i], kind); } return(result); }
void cmp256f64_check(FpCmpMode mode) { for (var i = 0; i < SampleSize; i++) { var x = Random.CpuVec256 <double>(); var y = Random.CpuVec256 <double>(); Span <double> xDst = stackalloc double[4]; x.StoreTo(ref head(xDst)); Span <double> yDst = stackalloc double[4]; y.StoreTo(ref head(yDst)); var expect = fmath.fcmp(xDst, yDst, mode); var actual = dfp.cmpf(x, y, mode); Claim.eq(expect, actual); } }
void cmp128f64_check(FpCmpMode mode) { for (var i = 0; i < SampleSize; i++) { var lhs = Random.CpuVec128 <double>(); var rhs = Random.CpuVec128 <double>(); Span <double> lDst = stackalloc double[2]; lhs.StoreTo(ref head(lDst)); Span <double> rDst = stackalloc double[2]; rhs.StoreTo(ref head(rDst)); var expect = fmath.fcmp(lDst, rDst, mode); var actual = dfp.cmpf(lhs, rhs, mode); Claim.eq(expect, actual); } }
public static bool fcmp(double x, double y, FpCmpMode mode) { var result = mode switch { FpCmpMode.EQ_OQ => x == y, FpCmpMode.EQ_OS => x == y, FpCmpMode.EQ_UQ => x == y, FpCmpMode.EQ_US => x == y, FpCmpMode.NEQ_OQ => x != y, FpCmpMode.NEQ_OS => x != y, FpCmpMode.NEQ_UQ => x != y, FpCmpMode.NEQ_US => x != y, FpCmpMode.LT_OQ => x <y, FpCmpMode.LT_OS => x <y, FpCmpMode.GT_OQ => x> y, FpCmpMode.GT_OS => x> y, FpCmpMode.LE_OQ => x <= y, FpCmpMode.LE_OS => x <= y, FpCmpMode.GE_OQ => x >= y, FpCmpMode.GE_OS => x >= y, FpCmpMode.NGE_UQ => !(x >= y), FpCmpMode.NGE_US => !(x >= y), FpCmpMode.NGT_UQ => !(x > y), FpCmpMode.NGT_US => !(x > y), FpCmpMode.NLE_UQ => !(x <= y), FpCmpMode.NLE_US => !(x <= y), FpCmpMode.NLT_UQ => !(x < y), FpCmpMode.NLT_US => !(x < y), _ => throw new NotSupportedException() }; return(result); }
static FloatComparisonMode fpmode(FpCmpMode m) => (FloatComparisonMode)m;