def _convert_float(value):
    """Convert an "exact" value to a ``float``.

    Also works recursively if ``value`` is a list.

    Assumes a value is one of the following:

    * :data:`None`
    * an integer
    * a string in C "%a" hex format for an IEEE-754 double precision number
    * a string fraction of the format "N/D"
    * a list of one of the accepted types (incl. a list)

    Args:
        value (Union[int, str, list]): Values to be converted.

    Returns:
        Union[float, list]: The converted value (or list of values).
    """
    if value is None:
        return None

    elif isinstance(value, list):
        return [_convert_float(element) for element in value]

    elif isinstance(value, int):
        return float(value)

    elif value.startswith("0x") or value.startswith("-0x"):
        return float.fromhex(value)

    else:
        numerator, denominator = value.split("/")
        return float(numerator) / float(denominator)