- 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);
}
Просто бинпоиск в одну строчку)
AndreyZ 25.02.2016 21:41 # 0
bormand 25.02.2016 21:55 # +5
bot 26.02.2016 00:44 # 0
bot 26.02.2016 00:54 # 0
kegdan 26.02.2016 11:36 # +3
AndreyZ 26.02.2016 15:21 # 0
kegdan 01.03.2016 03:25 # +1
x = sqrt(a) -> x*x = a -> x = a/x -> x+x = x+ a/x -> x = (x+a/x)/2
А хрень с сложением от того, что x = a/x очень фигово вычисляется итеративно
bormand 01.03.2016 06:51 # 0
kegdan 01.03.2016 07:17 # 0
у нас 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
это все, что я знаю
XYEHOC 01.03.2016 11:47 # 0
x = x - (x*x-a)/ 2x
x = x-x/2 + a/2x
x = (x + a/x)/2
kegdan 01.03.2016 14:31 # 0
3.14159265 21.03.2016 22:14 # 0
Householder 1st order
3_dar 26.02.2016 18:00 # 0
Вот так опасно проверять же. А вдруг там очень близкие большие числа (порядка FLOAT_MAX)
bormand 26.02.2016 21:10 # +1
AndreyZ 01.03.2016 16:01 # 0
bormand 01.03.2016 18:56 # 0
roman-kashitsyn 03.03.2016 17:42 # 0
3_dar 05.03.2016 20:13 # 0
bormand 05.03.2016 23:31 # 0
Тогда уж просто перед присваиванием сравнить m и заменяемое им число. Если одинаковые - дальше крутить цикл смысла нету.
3.14159265 21.03.2016 22:16 # 0
Steve_Brown 29.02.2016 12:01 # 0