繁体   English   中英

为什么这段代码会跳出循环?

[英]why does this code break out of loop?

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),因为float变量没有确切的表示形式。 由于舍入错误,您可能没有相同的值。

甚至2 * 0.5也可能不等于1。您可以使用以下方法:

if abs(float(a)-float(b)) < verySmallValue:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

浮点数学并不精确。 使用二进制浮点数不能精确地表示像0.2这样的简单值,并且浮点数的有限精度意味着操作顺序中的微小变化会改变结果。 不同的编译器和CPU体系结构以不同的精度存储临时结果,因此结果将根据环境的详细信息而有所不同。 如果您进行计算,然后将结果与某个预期值进行比较,则极不可能会获得预期的结果。 换句话说,如果您先进行计算然后进行以下比较:if(结果== ExpectedResult)

那么这种比较不可能是真的。 如果比较正确,则可能不稳定-输入值,编译器或CPU的微小变化可能会改变结果并使比较结果为假。

好吧,它还没有达到断点。 问题在于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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM