Одним из важных навыков в программировании является знание, какая информация будет наиболее полезной.Если вы добавите некоторую простую отладочную информацию:
while abs(diff) > epsl and _cnt < count:
guess = guess - (guess ** 2.0 + epsl) / (guess * 2.0)
diff = guess ** 2.0 - num
print guess, _cnt
_cnt = _cnt +1
print guess, _cnt
Вы можете видеть, что ваша программа быстро работает неправильно:
$ ./sqrt.py
0.49995 0
0.249874989999 1
0.124737394941 2
0.0619678553654 3
0.0301770577385 4
0.0134316410297 5
0.00299326718803 6
-0.0152075217183 7
-0.00431591416548 8
0.00942707405618 9
-0.000590335594744 10
....
Кажется, что число уменьшается на две итерации до тех пор, пока не станет отрицательным, когдаповедение становится очень трудно определить с первого взгляда.Но вы, очевидно, можете сказать, что первые несколько итераций неверны.
Что-то, что мне кажется довольно подозрительным: (guess ** 2.0 + epsl)
На самом деле вы не должны использовать epsilon при оценке метода Ньютона для квадратакорни - в конце концов, вы пытаетесь убедиться, что ваша ошибка меньше, чем эпсилон.