почему этот код выходит из цикла?
-
13-09-2019 - |
Вопрос
import math
t=raw_input()
k=[]
a=0
for i in range(0,int(t)):
s=raw_input()
b=1
c=1
a=int(s)
if a==0:
continue
else:
d=math.atan(float(1)/b) + math.atan(float(1)/c)
v=math.atan(float(1)/a)
print v
print d
print float(v)
print float(d)
while():
if float(v)== float(d):
break
b=b+1
c=c+1
d=math.atan(float(1)/float(b)) + math.atan(float(1)/float(c))
print d
k.append(int(b)+int(c))
for i in range(0,int(t)):
print k[i]
поскольку это совершенно очевидно float(v) != float(d)
до тех пор , пока b
становится 2 и c
становится 3.
Решение
Твой while
циклические тесты на пустом кортеже, результат которого равен False
.Таким образом, заявления, содержащиеся в while
цикл никогда не выполнится:
Если вы хотите, чтобы ваш while
цикл будет выполняться до тех пор, пока не встретится break
заявление, сделайте следующее:
while True:
if (some_condition):
break
else:
# Do stuff...
Другие советы
Очень опасно проводить сравнения типа float(a)==float(b), поскольку переменные с плавающей запятой не имеют точного представления.Из-за ошибок округления у вас могут не быть одинаковых значений.
Даже 2*0,5 может не равняться 1.Вы можете использовать следующее:
if abs(float(a)-float(b)) < verySmallValue:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
Математика с плавающей запятой не является точной.Простые значения, такие как 0.2, не могут быть точно представлены с помощью двоичных чисел с плавающей запятой, а ограниченная точность чисел с плавающей запятой означает, что незначительные изменения в порядке операций могут изменить результат.Разные компиляторы и процессоры архитектуры хранят временные результаты с разной точностью, поэтому результаты будут отличаться в зависимости от деталей вашей среды.Если вы выполните расчет, а затем сравните результаты с некоторым ожидаемым значением, то крайне маловероятно, что вы получите именно тот результат, который вы предполагали. Другими словами, если вы выполните вычисление , а затем выполните это сравнение:if (результат == Ожидаемый результат)
тогда маловероятно, что сравнение будет верным.Если сравнение истинно, то оно, вероятно, нестабильно – незначительные изменения во входных данных значения, компилятор или центральный процессор могут изменить результат и сделать сравнение равным false.
Ну, до точки останова дело не дошло.Проблема в том, что while()
вообще не зацикливается.Чтобы сделать бесконечный цикл, выполните while (1):
(поскольку условие while должно иметь значение true.Вот рабочий (очищенный) образец.
import math
t = raw_input()
k = []
a = 0.0
for i in range(0,int(t)):
s = float(raw_input())
b = 1.0
c = 1.0
a= float(s)
if a == 0:
continue
else:
d = math.atan(1.0/b) + math.atan(1.0/c)
v = math.atan(1.0/a)
print v
print d
while True:
if v == d:
print 'bar'
break
b += 1
c += 1
d = math.atan(1.0/b) + math.atan(1.0/c)
print d
k.append(int(b)+int(c))
for i in range(0,int(t)):
print k[i]