static @NotNull DfType fromRelation(@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;
    };
  }
static @NotNull DfType fromRelation(@NotNull RelationType relationType, double min, double max)