output items will match
the type of ``start + step``:

    >>> from fractions import Fraction
    >>> start = Fraction(1, 2)  # Start at 1/2
    >>> stop = Fraction(5, 2)  # End at 5/2
    >>> step = Fraction(1, 2)  # Count by 1/2
    >>> list(numeric_range(start, stop, step))
    [Fraction(1, 2), Fraction(1, 1), Fraction(3, 2), Fraction(2, 1)]

If *step* is zero, ``ValueError`` is raised. Negative steps are supported:

    >>> list(numeric_range(3, -1, -1.0))
    [3.0, 2.0, 1.0, 0.0]

Be aware of the limitations of floating-point numbers; the representation
of the yielded numbers may be surprising.

``datetime.datetime`` objects can be used for *start* and *stop*, if *step*
is a ``datetime.timedelta`` object:

    >>> import datetime
    >>> start = datetime.datetime(2019, 1, 1)
    >>> stop = datetime.datetime(2019, 1, 3)
    >>> step = datetime.timedelta(days=1)
    >>> items = iter(numeric_range(start, stop, step))
    >>> next(items)
    datetime.datetime(2019, 1, 1, 0, 0)
    >>> next(items)
    datetime.datetime(2019, 1, 2, 0, 0)

r