2016-01-12 2 views
1

Я пытаюсь вычислить квадратный корень с использованием петель. Я не уверен, что не так с моим кодом, потому что он не распознает правильный ответ.проблемы с кодом при попытке вычислить sqroot, используя цикл while

x = 25.0 
ans = 0.0 
while ans**2 <= x: 
    ans += 0.5 
if ans**2 == x: 
    print ans 
    print ans**2 

else: 
    print "no square root" 
    print ans 
    print ans**2 

Когда я бегу, он отображает следующий результат:

no square root 
5.5 
30.25 

и нет, это не домашнее задание, Im 32yrs старая жизнь обучающийся

редактировать

Спасибо всем за ответы. Ive изменил код немного, Ive изменилось в то время как цикл, и если оператор, и мой код выглядит как этот

x = 25.0 
ans = 0.0 
while ans**2 < x: 
    ans += 0.2 



if ans**2 != x: 
    print "root not found" 
    print ans 
    print ans**2 


else: 
    print "found square root" 
    print ans 
    print ans**2 

И когда я пытаюсь запустить его, он печатает следующий

root not found 
5.0 
25.0 

Im puzzeld

+3

'ans ** 2 <= x' =>' ans ** 2 Arman

+0

Duplicate?http://stackoverflow.com/questions/295579/fastest-way-to-determine-if-an-integers-square-root-is-an-integer –

+0

Проблема с отступом. Поместите if/else внутри вашего цикла. Вы запускаете все номера, которые хотите попробовать (выполнить весь цикл while), прежде чем пытаться их использовать! –

ответ

2

Линия if ans**2==x: никогда не будет правдой, поскольку предыдущий цикл while ans**2 <= x: уже сгенерирован ans.

Также для решения ваших последних редактирования:

0,2 или 1/5 в двоичном виде повторяющейся десятичной и не имеет точного представления, поэтому вы видите результаты округления. после того, как вы увеличиваете анс на 0,2 в несколько раз, вы не достигаете ровно 5, хотя вы очень близки к нему, в результате ans**2 не равен 25. Вам необходимо проверить с определенной точностью, например:

precision = 0.0001 
if math.fabs(ans**2 - x) <= precision: 
    """then they are close enough for our purposes""" 

Кстати 0.5 имеет точное представление в двоичном (не повторяется), поэтому у вас не было бы ошибки точности, поэтому я не стал упоминать об этом, когда вы увеличивали на 0,5.

0

Проблема с вашим алгоритмом проста, в строке while ans**2 <= x, позволяющей им быть равными, вы передаете ожидаемый результат на 1 итерацию, измените <=10 на <, чтобы исправить это.

Это, конечно, очень неточный способ сделать это, а вместо этого Newton's method довольно легко сделать и понять, используйте только 5 строк кода, чтобы сделать это, и гарантированно даст вам такой же точный результат в одном из быстрых, если не более быстрых, способов.

EDIT

что вы опыт в вашей второй версии является Accuracy problems из арифметики с плавающей точкой, то, что вы видите, как результат на самом деле не 5,0, а нечто большее, как 5.0000000000000017763568394002504646778106689453125, что при печати питона сделать некоторые округление до некоторой точности по умолчанию уровень и показать вам, как 5.0, но внутренне, что некрасиво номер, и когда вы умиротворять его, вы действительно получите что-то вроде 25.00000000000001776356839400, что, конечно, отличается от 25,0

вы также можете проверить это видео: Floating Point Numbers - Computerphile