2015-04-24 7 views
-1

Я создал очень простую программу с квадратным корнем и сразу же распечатал ответ для elif b > x при использовании поплавков. Однако, если я просто использовал целые числа, это работает (но это означает, что я не могу найти квадратный корень из 9.61, например).Квадратный корень ошибок с плавающей точкой

Вот программа:

x = float(raw_input("What is the number? ")) 
a = 1.0 
b = a*a 
while True: 
    if b == x: 
     print "The answer is", a 
     break 
    elif b > x: 
     #print "a = ",a 
     #print "x = ",x 
     print "That is beyond my computing power. Sorry." 
     break 
    elif b < x: 
     a = a + 0.1 
     b = a*a 
     continue 
+4

«не будет работать» не технический термин. Пожалуйста, добавьте более подробную информацию, например. ожидаемый против фактического выхода, сообщения об ошибках и т. д. –

+0

Иными словами - какая ошибка вы получаете? – Cullub

+0

В настоящее время этот вопрос не по теме, поскольку он просто спрашивает «почему этот код не работает», а не дает достаточно подробностей, чтобы вопрос был полезным для будущих пользователей. Я не собираюсь отмечать это, так как похоже, вы можете отредактировать его, чтобы уточнить. – Cullub

ответ

2

Ваша проблема проверки floating point equality.

Окончательная итерация вашего цикла сравнивает 3.1 * 3.1 с 9.61 и (представление с плавающей запятой ...) 3.1 * 3.1 больше 9.61, что завершает ваш цикл «вне пределов моей вычислительной мощности».

>>> 3.1 * 3.1 == 9.61 
False 

>>> 3.1 * 3.1 > 9.61 
True 

>>> 3.1 * 3.1 
9.6100000000000001 

Если вы хотите сравнить числа с плавающей точкой, как это, убедитесь, что разница между ними достаточно (epsilon) маленький, вместо проверки на равенство.

Если вы хотите изучить более числовые методы поиска корней, прочитайте статью в Википедии по адресу Newton-Raphson method.

. (Примечание: Некоторые рациональные числа могут быть представлены поплавками, так что ваш цикл может быть в состоянии найти квадратный корень из 3.61, например)