public class Roots { public interface Function { public double f(double x); } private static int sign(double x) { return (x < 0.0) ? -1 : (x > 0.0) ? 1 : 0; } public static void printRoots(Function f, double lowerBound, double upperBound, double step) { double x = lowerBound, ox = x; double y = f.f(x), oy = y; int s = sign(y), os = s; for (; x <= upperBound ; x += step) { s = sign(y = f.f(x)); if (s == 0) { System.out.println(x); } else if (s != os) { double dx = x - ox; double dy = y - oy; double cx = x - dx * (y / dy); System.out.println("~" + cx); } ox = x; oy = y; os = s; } } public static void main(String[] args) { Function poly = new Function () { public double f(double x) { return x*x*x - 3*x*x + 2*x; } }; printRoots(poly, -1.0, 4, 0.002); } }