public class Sqrt { double precision = 0.0001; //@ ghost public static double eps = 0.00001; /*@ @ requires x >= 0.0; @ //ensures org.jmlspecs.models.JMLDouble.approximatelyEqualTo(x, \result * \result, eps); @*/ public double sqrt(double x) { double a = 0, b = x+1, m = 0; //@ assert b >= x; //@ assert x >= a; //@ assert b >= a; //@ loop_invariant b >= a; while (b*b - a*a > precision) { m = (b + a) / 2; if (m * m > x) { b = m; } else { a = m; } //@ assert b >= m && m >= a; //@ assert b >= a; //@ assert b*b >= m*m && m*m >= a*a; } // @ assert b >= m && m >= a; // @ assert b*b >= m*m && m*m >= a*a; return m; } } // FIXME - requires explicit AUFNIRA logic; also needs more help - current specs are invalid (e.g. b ==x does not mean b*b > x)