public static String to(double input) throws ParseException {
        if (input < 1 || input % 1 != .0D)
            throw new ParseException(
                    new Diagnosis().append("diagnosis.roman-numeral-to-invalid-value", input),
                    ParseException.ParseType.GENERIC
            );

        int normalized = (int) input;
        String output = "";

        for (RomanNumeral unit: RomanNumeral.reverseOrder()) {
            while (normalized > unit.value()) {
                output += unit.getChar();
                normalized -= unit.value();
            }

            if (unit.hasSubtractiveUnit()) {
                int subtracted = unit.subtractiveUnitValue();
                if (normalized >= subtracted) {
                    output += String.valueOf(unit.subtractiveUnit().getChar())
                            + String.valueOf(unit.getChar());
                    normalized -= subtracted;
                }
            }
        }

        return output;
    }