protected override FloatingVersion Evaluate(FloatingVersion x, FloatingVersion y)
        {
            // cannot be translated,
            // so we'll just merge the ranges

            var result = new FloatingVersion();

            // LowerBound = Max(x.LowerBound, y.LowerBound)
            var lowerx = x.LowerBound.AnyToZero();
            var lowery = y.LowerBound.AnyToZero();

            var lowercomp = lowerx.CompareTo(lowery);

            if (lowercomp < 0 || (lowercomp == 0 && !x.LowerBoundExclusive))
            {
                result.LowerBound          = lowerx;
                result.LowerBoundExclusive = x.LowerBoundExclusive;
            }
            else
            {
                result.LowerBound          = lowery;
                result.LowerBoundExclusive = y.LowerBoundExclusive;
            }

            // UpperBound = Min(x.UpperBound, y.UpperBound)
            var upperx = x.UpperBound.GetClosestHigher();
            var uppery = y.UpperBound.GetClosestHigher();

            var uppercomp = upperx.CompareTo(uppery);

            if (uppercomp > 0 || (uppercomp == 0 && !x.UpperBoundExclusive))
            {
                result.UpperBound          = x.UpperBound;
                result.UpperBoundExclusive = x.UpperBoundExclusive;
            }
            else
            {
                result.UpperBound          = y.UpperBound;
                result.UpperBoundExclusive = y.UpperBoundExclusive;
            }

            //
            return(result);
        }
 protected abstract FloatingVersion Evaluate(FloatingVersion x, FloatingVersion y);