DfType (@NotNull RelationType relationType, double min, double max) { assert !Double.isNaN(min); assert !Double.isNaN(max); return switch (relationType) { case LE -> create(Double.NEGATIVE_INFINITY, max == 0.0 ? 0.0 : max, false, true); case LT -> max == Double.NEGATIVE_INFINITY ? DfTypes.DOUBLE_NAN : create(Double.NEGATIVE_INFINITY, Math.nextDown(max), false, true); case GE -> create(min == 0.0 ? -0.0 : min, Double.POSITIVE_INFINITY, false, true); case GT -> min == Double.POSITIVE_INFINITY ? DfTypes.DOUBLE_NAN : create(Math.nextUp(min), Double.POSITIVE_INFINITY, false, true); case EQ -> { if (min == 0.0) min = -0.0; if (max == 0.0) max = 0.0; yield create(min, max, false, true); } case NE -> { if (min == max) { if (min == 0.0) { yield create(-0.0, 0.0, true, true); } yield create(min, min, true, true); } yield DfTypes.DOUBLE; } default -> DfTypes.DOUBLE; }; }