2009-06-15 3 views
0
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되고 cFalse로 평가 빈 튜플에 3왜이 코드가 루프를 벗어 났습니까?

+0

어떻게 읽을 수있는 코드로 서식을 지정 하시겠습니까? – jitter

+1

이제 형식이 –

+3

입니다. 흥미 롭습니다. 파이썬에서 코드는 형식적으로 모호합니다. * 읽을 수없는 경우 ... – Edmund

답변

8

귀하의 while 루프 테스트를하게 float(v) != float(d)까지 매우 분명의로. 따라서, while 루프 내에서 문이 실행되지 않습니다 :

을 당신이이 break 문을 만날 때까지 당신의 while 루프를 실행하려면 다음을 수행

while True: 
    if (some_condition): 
     break 
    else: 
     # Do stuff... 
+0

float (v) == float (d) 일 경우 : 휴식 이 부분은 실행됩니다! – Hick

+0

죄송합니다. 실행되었습니다 .. !! 고마워하지만 진실한 키워드를 !! – Hick

+0

True와 False는 파이썬 키워드이며 true 또는 false는 아닙니다. – Triptych

0

음, 휴식에 도달하지 않았다 포인트. 문제는 while()이 전혀 루핑되지 않는다는 것입니다. 그동안 조건이 true로 평가해야하기 때문에 무한 루프를 수행하려면, (while (1):을한다. 여기서 작업 (정리) 샘플입니다.

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] 
+1

FWIW : Python에서는 "while True"가 "while (1)"보다 좋습니다. –

+0

아, 맞아, 고정 :) – mikl

2

을 부동의 (a) == 플로트 같은 comparsisons을 (만들기 위해 매우 위험한 경우 . 플로트 변수가 더 정확한 표현이 없기 때문에 B)으로 인해 당신이 같은 글의 값을 가질 수 없습니다 오류를 반올림하기 위해 다음과 같은 사용할 수 있습니다 1.

심지어 2 * 0.5 동일하지 않을 수 있습니다.

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

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

부동 소수점 연산이 정확하지 않습니다. 0.2 등 간단한 값 정확하게 이진 부동 소수점 수를 이용하여 표현 수 없으며 번호 부동 소수점의 제한된 정밀도 에 약간의 변경이 동작들의 순서가 결과를 변경할 수 있음을 의미한다. 다른 컴파일러와 CPU 아키텍처는 다른 결과로 임시 결과를 저장하므로 결과는 이고 사용자 환경의 결과에 따라 달라집니다. 계산을 수행 한 다음 결과를 일부 예상 값과 비교하면 결과는 과 정확히 일치하지 않을 가능성이 높습니다. 당신이 다음 계산을 하고있는 경우 즉,이 비교를 수행 (결과 == expectedResult) 경우

는 다음의 비교가 사실이 될 것 같지는 않다. 비교가 참이면 아마도 불안정합니다 - 입력 값이 약간 변경되면 값, 컴파일러 또는 CPU가 을 변경하고 비교를 false로 만들 수 있습니다.