convert speed units https en wikipedia orgwikikilometresperhour https en wikipedia orgwikimilesperhour https en wikipedia orgwikiknotunit https en wikipedia orgwikimetrepersecond convert speed from one unit to another using the speedchart above kmh 1 0 ms 3 6 mph 1 609344 knot 1 852 convertspeed100 kmh ms 27 778 convertspeed100 kmh mph 62 137 convertspeed100 kmh knot 53 996 convertspeed100 ms kmh 360 0 convertspeed100 ms mph 223 694 convertspeed100 ms knot 194 384 convertspeed100 mph kmh 160 934 convertspeed100 mph ms 44 704 convertspeed100 mph knot 86 898 convertspeed100 knot kmh 185 2 convertspeed100 knot ms 51 444 convertspeed100 knot mph 115 078 convert speed from one unit to another using the speed_chart above km h 1 0 m s 3 6 mph 1 609344 knot 1 852 convert_speed 100 km h m s 27 778 convert_speed 100 km h mph 62 137 convert_speed 100 km h knot 53 996 convert_speed 100 m s km h 360 0 convert_speed 100 m s mph 223 694 convert_speed 100 m s knot 194 384 convert_speed 100 mph km h 160 934 convert_speed 100 mph m s 44 704 convert_speed 100 mph knot 86 898 convert_speed 100 knot km h 185 2 convert_speed 100 knot m s 51 444 convert_speed 100 knot mph 115 078
speed_chart: dict[str, float] = {
    "km/h": 1.0,
    "m/s": 3.6,
    "mph": 1.609344,
    "knot": 1.852,
}

speed_chart_inverse: dict[str, float] = {
    "km/h": 1.0,
    "m/s": 0.277777778,
    "mph": 0.621371192,
    "knot": 0.539956803,
}


def convert_speed(speed: float, unit_from: str, unit_to: str) -> float:
    
    if unit_to not in speed_chart or unit_from not in speed_chart_inverse:
        msg = (
            f"Incorrect 'from_type' or 'to_type' value: {unit_from!r}, {unit_to!r}\n"
            f"Valid values are: {', '.join(speed_chart_inverse)}"
        )
        raise ValueError(msg)
    return round(speed * speed_chart[unit_from] * speed_chart_inverse[unit_to], 3)


if __name__ == "__main__":
    import doctest

    doctest.testmod()