2013-04-11 2 views
1

이것은 매우 간단한 코드처럼 보입니다. 그러나 어떤 이유로 그것이 작동하지 않습니다. 특정 시간에 값을 출력해야하지만 if 문은 평가하지 않는 것 같습니다. 다음은 내가하려는 일의 기본 버전입니다.If 문이 작동하지 않습니다 (파이썬)

dt=.1 

while t<=10: 
    if t==5: 
      print('yes') 
    t+=.1 

저는 문자 그대로이 코드를 사용해 보았지만 모든 시간 단계마다 문자를 인쇄했지만 '예'라고 인쇄하지는 않습니다. 내 코드에 다른 코드가있는 경우 (예 :

if 10<=t<60: 
    do stuff 

) 이러한 if 문은 완벽하게 실행됩니다. 나는 그것을 t==5.0t==float(5)을 필요로하는 경우를 대비하여 시도했지만 그 중 하나는 작동하지 않았다. 이것은 나를 미친 듯이 몰아 넣습니다. 누군가 나를 기쁘게 해 주면 좋을 것 같습니다. 나는 Ubuntu 12.4의 Spyder에서 이것을 실행하고 있는데, import sitecustomize이 실패했다는 메시지를 받았습니다. 이것과 관련이 있을까요? 나는 그 메시지로 잠시 동안 코드를 실행 해 왔으며 이전에는 아무런 문제도 일으키지 않았다. 편집

내가 당신 t 떠있는 점과는 100 %의 정확도로 표현되어 있기 때문입니다 도움

+9

[포인트 부정확 부동 (http://docs.python.org/2/tutorial/floatingpoint.html) – jamylak

+2

HTTP :/
그래서 정밀 제어 당신이 찾고있는 아마 /docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항 – Patashu

답변

3

1) 부동 소수점은 정확도가 무한합니다. 메모리의 특정 비트 수 (일반적으로 64 또는 32)를 사용합니다.

2) 이진 내부 표현 (모든 유효 자릿수는 기본적으로 첫 번째)을 사용합니다.

3) .1은 바이너리 비트의 패턴을 무한히 반복하는 패턴으로 만 저장할 수 없으므로 가수가 너무 커서 부동 소수점 숫자는 실제로 .1의 근사값이며 실제로는 그렇지 않습니다. .1. (0.5와 0.25 같은 것은 할 수 있습니다.)

4) 따라서 .1s를 더하는 것이 완벽한 결과를 보장하지 않습니다. 잘못된 방법을 반올림하여 오류가 발생합니다. 예를 들어 .1 자체에 10 번 추가하면 1.0000 ... 1 또는 0.999999 ... 9가됩니다.

는 모든 컴퓨터 과학자는 부동 소수점 연산에 대해 알아야 할 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html를 참조

0

에 대한

if int(t)==5 and t<5+dt: 

감사를 사용, 작동 할 수있어 기계 코드. 이를 정수로 변환하거나 if 조건을 변경하여이 문제를 해결할 수 있어야합니다 (정수로 변환하거나 불평등 함 사용).

0

정수로 (부동이다)하고 비교이 변환 t ..

if int(t) == 5: 
    ... 

또는

import math 
t_flr = math.floor(t) 
if t_flr == 5: 
    ... 
시도
+2

당신이 모르는 사이에 나는 "floor"보다 "round"를 사용하려고합니다. 방향으로 오류가 발생합니다. – Patashu

+0

약간의 조정을 해 주셔서 감사합니다. – nickg

2

부동 소수점 연산이 부정확 한 이유는 많지만 코드를 수정하는 방법에 대한 답변은 없습니다.

길게 이야기하면 while t<10.0+dt/2if abs(t-5.0) <= dt/2입니다.

1

작성한 코드를 기반으로 작성된 예제가 저에게 맞습니다.
http://docs.python.org/3.3/library/decimal

from decimal import * 
    getcontext().prec = 3 

    dt=.1 

    t = 0 

    while t <= 10: 
     if Decimal(t) == 5: 
      print('yes') 
     t = Decimal(Decimal(t) + Decimal(dt)) 
     print(t) 
관련 문제