Many root-finders allow the user to supply a starting point or points to begin searches. This allows users to try to "fiddle" the results to find different roots or allow the finder to converge to a root.
If it does not make sense to allow a user to provide starting values you could begin by probing a handful of points:
- -1, 0, 1
- -10, 0, 10
- -100, 0, 100
- etc.
If the input is an odd polynomial, this will eventually discover a suitable range for bisection. If the input is an even polynomial, you might never catch sign changes (consider f(x)=x^2 -- it is never negative), so be prepared to give up after a certain (configurable?) amount of probing.
I've suggested making the ranges larger by powers of 10 here; since the bisection approach cuts the range in half each time, perhaps this is too conservative. (It'll take between two and three iterations of the bisection to reduce a range to the next "tighter" bracket.) Maybe better would be larger jumps:
- -10, 0, 1
- -1000, 0, 1000
- -100000, 0, 100000
- etc.
This will perform fewer probes but require more bisection. Try a handful of polynomials and track execution time for finding the roots with both suggestions.