@Override
    public double membership(double x) {
        if (Double.isNaN(x)) {
            return Double.NaN;
        }

        if (Op.isEq(start, end)) {
            return 0.0;
        }

        if (Op.isLt(start, end)) {
            if (Op.isLE(x, start)) {
                return 0.0;
            }
            if (Op.isGE(x, end)) {
                return 1.0;
            }
            return (x - start) / (end - start);
        } else {
            if (Op.isGE(x, start)) {
                return 0.0;
            }
            if (Op.isLE(x, end)) {
                return 1.0;
            }
            return (start - x) / (start - end);
        }
    }