in any case, your method looks wrong. if all you want is the direction the spline is going at a particular point, then use the second derivative.
q(t) = 0.5 *((2 * P1) + (-P0 + P2) * t + (2*P0 - 5*P1 + 4*P2 - P3) * t^2 + (-P0 + 3*P1- 3*P2 + P3) * t^3));
derive and you should get
q'(t) = 0.5 *((2 * P1) + (-P0 + P2) + (2*P0 - 5*P1 + 4*P2 - P3) * 2 * t + (-P0 + 3*P1- 3*P2 + P3) * 3 * t^2));
the vector q'(t) should give you the look direction for your camera.
Equally, derive again and you get
q'''(t) = 0.5 *((2*P0 - 5*P1 + 4*P2 - P3) * 2 + (-P0 + 3*P1- 3*P2 + P3) * 6 * t));
q'''(t) is the 'acceleration' of the spline at a point, or if you will, for a road surface, will give you the natural 'banking' or curvature of the spline at a point.
Again, I am not sure about the continuity of the curve at the first and second derivative, so you may find 'breaks'. Let me check on the wiki :)
EDIT : Ah, it's not C2 continous, but it is C1 continuous, so using the first derivative for the direction of your camera will be fine.
I would then recommend calculating the second derivative at the control points, and lineraly interpolate along that that section to get the curvature of the spline (or if you want, the natural 'up' vector of your camera).