Actually it hasn't anymore :P There's something wrong with my Cardano, but I'll sort that out - might have to use Newton's method for that afterall.
I found out that the equation I'm solving is guaranteed to have only real roots. When they become imaginary it's only because of floating point errors. So rather than checking for small imaginary components, I just force the discriminant to be zero if it happens to come out negative.