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

0 投票
4 回答
563 浏览
提问于 2025-04-15 12:15
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...

撰写回答