为什么这段代码会跳出循环?
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]
很明显,直到 b
变成 2 和 c
变成 3 之前,float(v) != float(d)
是成立的。
4 个回答
2
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
浮点数运算并不是完全准确的。像0.2这样简单的数字,用二进制浮点数表示时,无法做到精确。浮点数的精度有限,这意味着运算顺序的微小变化可能会导致结果不同。不同的编译器和CPU架构在存储临时结果时使用的精度也不同,所以根据你所用的环境,结果可能会有所不同。如果你进行了一次计算,然后把结果和某个预期值进行比较,几乎不可能得到你想要的完全一致的结果。换句话说,如果你做了一个计算,然后进行这样的比较:if (result == expectedResult)
那么这个比较很可能不会成立。如果比较成立,那可能是不稳定的——输入值、编译器或CPU的微小变化都可能导致结果改变,从而使得比较变为假。
2
把像 float(a)==float(b) 这样的比较写在代码里是很危险的,因为浮点数(float)在计算机里并不能精确表示。由于四舍五入的误差,你可能会发现它们的值并不完全相同。
比如说,2*0.5 可能不等于 1。你可以使用下面的方法:
if abs(float(a)-float(b)) < verySmallValue:
7
你的 while
循环是在检查一个空的元组,而空的元组被认为是 False
。所以,while
循环里面的代码永远不会执行:
如果你想让 while
循环一直运行,直到遇到 break
语句,可以这样做:
while True:
if (some_condition):
break
else:
# Do stuff...