- 1
- 2
- 3
int main() {
for (float n = 0, l = 0, q = scanf("%f", &n), r = n, m = (l + r) / 2; r - l > 0.00001 || 0 * printf("%f", l); m*m <= n ? l = m : r = m, m = (l + r) / 2);
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+3
int main() {
for (float n = 0, l = 0, q = scanf("%f", &n), r = n, m = (l + r) / 2; r - l > 0.00001 || 0 * printf("%f", l); m*m <= n ? l = m : r = m, m = (l + r) / 2);
}
Просто бинпоиск в одну строчку)
x = sqrt(a) -> x*x = a -> x = a/x -> x+x = x+ a/x -> x = (x+a/x)/2
А хрень с сложением от того, что x = a/x очень фигово вычисляется итеративно
у нас f(x) = x*x-a
f'(x) = 2x
откуда
x = x - (x*x-a)/ 2x
x = x-x/2 - a/2x
x = (x - a/x)/2
это все, что я знаю
x = x - (x*x-a)/ 2x
x = x-x/2 + a/2x
x = (x + a/x)/2
Householder 1st order
Вот так опасно проверять же. А вдруг там очень близкие большие числа (порядка FLOAT_MAX)
Тогда уж просто перед присваиванием сравнить m и заменяемое им число. Если одинаковые - дальше крутить цикл смысла нету.