pourquoi ce code sortir de la boucle?
-
13-09-2019 - |
Question
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]
car il est très évident float(v) != float(d)
jusqu'à b
devient 2 et 3 c
devient.
La solution
Vos tests de boucle de while
sur un tuple vide, qui évalue à False
. Ainsi, les déclarations dans la boucle de while
ne sera jamais exécuter:
Si vous voulez que votre boucle de while
à courir jusqu'à ce qu'il rencontre une déclaration de break
, faites ceci:
while True:
if (some_condition):
break
else:
# Do stuff...
Autres conseils
Si est très dangereux de faire comparsisons comme flotteur (a) == float (b) étant donné que les variables flottantes ne sont pas représentés exacte. En raison d'erreurs d'arrondi vous ne pouvez pas avoir des valeurs Identic.
Même 2 * 0,5 peut ne pas être égale 1. Vous pouvez utiliser ce qui suit:
if abs(float(a)-float(b)) < verySmallValue:
http://www.cygnus-software.com/papers/comparingfloats /comparingfloats.htm
Floating mathématiques points n'est pas exact. des valeurs simples comme 0.2 ne peuvent pas être précisément représenté à l'aide binaire nombres à virgule flottante, et la précision limitée de la virgule flottante nombre signifie que de légers changements dans l'ordre des opérations peut changer la résultat. Différents compilateurs et CPU architectures stocker les résultats temporaires à différents precisions, donc les résultats diffèrent selon les détails de votre environnement. Si vous faites une calcul et comparer les résultats par rapport à une valeur attendue ce est très peu probable que vous obtiendrez exactement le résultat que vous vouliez. Dans Autrement dit, si vous faites un calcul puis faire cette comparaison: si (Résultat == expectedResult)
il est peu probable que la sera vraie. Si la la comparaison est vrai, alors il est probablement des changements minuscules dans l'entrée - instable valeurs, compilateur, ou CPU peuvent changer le résultat et faire la comparaison soit faux.
Eh bien, il n'a pas atteint le point de rupture. Le problème est que while()
ne fonctionne pas en boucle du tout. Pour faire une boucle infinie, faire while (1):
(puisque la condition while doit être évaluée à true. Voici un échantillon de travail (nettoyé).
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]