The correct set of formulas is
w = b+sign(b)*sqrt(b^2-4*a*c)
x1 = -w/(2*a)
x2 = -(2*c)/w
where sign(b)=1 if b>=0 and sign(b)=-1 if b<0.
Your formulas as well as the standard formulas lead to catastrophic cancellation in one root of b is large wrt. a and c.
If you want to go to the extremes, you can also guard against over- and underflow in the computation of the term under the square root.
Let m denote the maximum size of |a|, |b| and |c|, for instance the maximum of the exponent in their floating point representation, or of their absolute value... Then
w = b+sign(b)*m*sqrt( (b/m)*(b/m)-4*(a/m)*(c/m) )
has a term between -10 and 10 below the root. And if this term is zero, then that is not caused by underflow.