почему этот код выходит из цикла? - PullRequest
0 голосов
/ 15 июня 2009
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.

Ответы [ 4 ]

8 голосов
/ 15 июня 2009

Ваш цикл while проверяет пустой кортеж, который оценивается как False. Таким образом, операторы внутри цикла while никогда не будут выполняться:

Если вы хотите, чтобы ваш цикл while работал до тех пор, пока не встретится оператор break, сделайте следующее:

while True:
    if (some_condition):
        break
    else:
        # Do stuff...
2 голосов
/ 20 сентября 2009

http://www.cygnus -software.com / документы / comparingfloats / comparingfloats.htm

Математика с плавающей точкой не является точной. Простые значения, такие как 0,2, не могут быть точно представлены с использованием двоичного числа с плавающей запятой и ограниченная точность с плавающей точкой цифры означают, что небольшие изменения в порядок операций может изменить результат. Разные компиляторы и процессор архитектура хранит временные результаты с разной точностью, поэтому результаты будет отличаться в зависимости от деталей вашей среды. Если вы делаете расчет, а затем сравнить результаты против некоторого ожидаемого значения это очень маловероятно, что вы получите именно тот результат, который вы рассчитывали. В Другими словами, если вы делаете расчет а затем сделайте это сравнение: если (результат == ожидаемый результат)

тогда вряд ли сравнение будет правдой. Если Сравнение верно, то, вероятно, нестабильный - крошечные изменения на входе значения, компилятор или процессор могут измениться результат и сделать сравнение будет ложь.

2 голосов
/ 20 сентября 2009

Если очень опасно проводить сравнения, такие как float (a) == float (b), поскольку переменные float не имеют точного представления Из-за ошибок округления у вас могут не быть идентичные значения.

Даже 2 * 0,5 может не совпадать 1. Вы можете использовать следующее:

if abs(float(a)-float(b)) < verySmallValue:
0 голосов
/ 15 июня 2009

Ну, это не достигло точки разрыва. Проблема в том, что 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]
...