doublesqrt(double x){ double eps = 1e-12; double t = x; while (abs(t - x / t) > eps * t) { t = (t + x / t) / 2.0; } return t; }
1 2 3 4 5 6 7 8 9 10
doublesqrt2(double x){ double eps = 1e-12; double t = x; double lastt; do { lastt = t; t = (t + x / t) / 2.0; } while (abs(t-lastt) > eps); return t; }
二分法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
doublesqrt3(double x){ double eps = 1e-12; double left = 0, right = x; double m = x; double lastt; do{ lastt = m; m = (left + right) * 0.5f; if (m*m >= x) { right = m; } else { left = m; } } while (abs(m - lastt) > eps); return m; }