let rec v_atantwo v1 v2 = match (v1, v2) with
        | (N i1, N i2) -> v_atantwo (R (float_of_int i1)) (R (float_of_int i2))
        | (N i1, R f2) -> v_atantwo (R (float_of_int i1)) v2
        | (N i1, Zero-> v_atantwo (R (float_of_int i1)) (R 0.)
        | (N i1, Vec (size2, vec2)) -> raise (Value_operation "atan2 sca vec.")
        | (N i1, W-> W

        | (R f1, N i2) -> v_atantwo v1 (R (float_of_int i2))
        | (R f1, R f2) -> R (atan2 f1 f2)
        | (R f1, Zero-> v_atantwo v1 (R 0.)
        | (R f1, Vec (size2, vec2)) -> raise (Value_operation "atan2 sca vec.")
        | (R f1, W-> W

        | (Vec (size1, vec1), Vec (size2, vec2)) -> make_vector size1 (fun i -> v_atantwo (vec1 i) (vec2 i))
        | (Vec (size1, vec1), Zero-> make_vector size1 (fun i -> v_atantwo (vec1 i) Zero)
        | (Vec (size1, vec1), _) -> raise (Value_operation "atan2 vec sca.")
 
        | (ZeroN i2) -> v_atantwo (R 0.) (R (float_of_int i2))
        | (ZeroR f2) -> v_atantwo (R 0.) v2
        | (ZeroVec (size2, vec2)) -> make_vector size2 (fun i -> v_atantwo Zero (vec2 i))
        | (ZeroZero-> v_atantwo (R 0.) (R 0.)
        | (ZeroW-> W

        | (WVec (size2, vec2)) -> raise (Value_operation "atan2 sca vec.")
        | (W, _) -> W