Since you mentioned algorithms, you could use a Bresenham style algorithm. Let
$$F(x, y) = (x - C_x)^2 + (y - C_y)^2 - r^2$$
Note that if $F(x, y) > 0$ then $(x, y)$ is outside the circle, and if $F(x, y) < 0$ then $(x, y)$ is inside the circle. Now you can just do a binary search along the line segment, keeping $F(x_1, y_1) < 0$ and $F(x_2, y_2) > 0$ until you have enough precision.
If F(E) < 0 then return "Error, E inside circle"
If F(S) > 0 then return "Error, S outside circle"
V1 = E
V2 = S
Loop:
// assert V1 outside circle
// assert V2 inside circle
M = (V1 + V2)/2
If F(M) = 0 then return (M, M)
If |V1 - V2| < Precision then return (V1, V2)
If F(M) < 0 then V2 = M
If F(M) > 0 then V1 = M
That's one bit of accuracy per loop. If you want it to close in faster, use the value of F to bias M towards which V has less error:
M = (-F(V2) * V1 + F(V1) * V2) / (F(V1) - F(V2))
The advantage of the Bresenham style approach is that you can always guarantee that the answer is between V1 and V2, and guarantees of correctness are always more important than unrequired or unproven speed.