# src/common_utils.py

from typing import List, Union

def generate_parameter_range(start: Union[int, float], end: Union[int, float], step: Union[int, float]) -> List[Union[int, float]]:
    """
    根据开始、结束和步长生成一个参数值的列表。
    支持整数和浮点数。

    Args:
        start (Union[int, float]): 参数范围的起始值。
        end (Union[int, float]): 参数范围的结束值。
        step (Union[int, float]): 参数的步长。

    Returns:
        List[Union[int, float]]: 生成的参数值列表。
    """
    if step == 0:
        raise ValueError("步长不能为0。")
    if (end - start) * step < 0: # 步长方向与范围不符
        raise ValueError("步长方向与起始/结束值不一致，请检查步长正负。")

    param_range = []
    current_value = start
    while (step > 0 and current_value <= end) or (step < 0 and current_value >= end):
        param_range.append(current_value)
        current_value += step
        # 针对浮点数精度问题进行小幅调整，避免无限循环或过早停止
        if isinstance(step, float) or isinstance(start, float) or isinstance(end, float):
            current_value = round(current_value, 10) # 四舍五入到一定小数位

    return param_range

# 示例：
# print(generate_parameter_range(0.99, 1.01, 0.005)) # [0.99, 0.995, 1.0, 1.005, 1.01]
# print(generate_parameter_range(5, 20, 5))         # [5, 10, 15, 20]