Генератор діапазону з плаваючою точкою

Реалізуйте генераторну функцію float_range, яка працює подібно до вбудованої функції range, але підтримує дійсні числа (з плаваючою точкою) та повертає значення ліниво (за допомогою yield). Генератор повинен створювати послідовність чисел від start до stop (не включаючи stop) з кроком step.

Функція повинна коректно працювати у випадках:

  • додатного та від’ємного кроку;
  • дробових кроків (наприклад, 0.1);
  • граничних випадків, як-от start >= stop при додатному кроці;

Сигнатура функції:

def float_range(start: float, stop: float, step: float) -> Iterator[float]:

Приклад

# Приклад 1: Крок додатній, від 1.0 до 2.0 (не включно)
# [1.0, 1.3, 1.6, 1.9]
print(list(float_range(1.0, 2.0, 0.3)))  

# Приклад 2: Крок від’ємний, від 5.0 до 3.0 (не включно)
# [5.0, 4.5, 4.0, 3.5]
print(list(float_range(5.0, 3.0, -0.5)))  

# Приклад 3: Малий крок 0.1, беремо тільки перші 3 елементи
# Генерує нескінченну кількість чисел, але ми зупиняємося на 3-х перших
print(list(float_range(0.0, 1.0, 0.1))[:3])  

# Приклад 4: Початок і кінець однакові — генератор нічого не повертає
print(list(float_range(0.0, 0.0, 1.0)))  # []

# Приклад 5: Крок від’ємний, але `start < stop` — умова ніколи не виконається
# Генератор нічого не повертає
print(list(float_range(1.0, 2.0, -1.0)))  # []

Підказки до реалізації

  • використовуйте цикл while та yield;
  • залежно від знаку кроку:
    • якщо step > 0, зупиняйтесь, коли current >= stop;
    • якщо step < 0, зупиняйтесь, коли current <= stop;
  • уникайте проблем із точністю дійсних чисел — заокруглюйте результат, наприклад, через round(...);
  • якщо step == 0, піднімайте помилку ValueError.