class Bisection {
    
    interface Function { 
        double f (double x);
    }

    static double squeeze(double a, double b, double interval, Function f) {
        assert(f.f(a) < 0 && f.f(b) > 0 && a < b);
        double midpoint = (a + b) / 2;
        System.out.println(
                String.format("f(%f)=%f", midpoint, f.f(midpoint)));
        if (Math.abs(f.f(midpoint)) < interval) {
            return midpoint;
        } else {
            return squeeze(f.f(midpoint) < 0 ? midpoint : a,
                    f.f(midpoint) > 0 ? midpoint : b, interval, f);
        }
    }
    
    public static void main(String[] args) {
        Function f = (double x) -> (x * x - 2);
        System.out.println("Root = " + squeeze(0.0, 3.0, 0.1, f));
    }
    
}
