2012-08-27 2 views
4

이런 식으로 보지 못했습니다. 간단한 while 루프 :파이썬 while 루프 inconstancy

t_end = 100.0 
t_step= 0.1 
time = 0 

while time<=t_end: 
    time+=t_step 
    print time 

최근 3 개 인쇄 값 :

... 
99.9 
100.0 
100.1 

이 바로 내 보인다.

지금, 나는 0.01 t_step을 변경

t_end = 100.0 
t_step= 0.01 
time = 0 

while time<=t_end: 
    time+=t_step 
    print time 

최근 3 개 인쇄 값 :

... 
99.98 
99.99 
100.0 

질문 : 왜 마지막 루프 시간 = t_end = 100.0 가야하지 않는 이유는 무엇입니까?

대체 솔루션은 무엇입니까?

+0

관련 항목 : [이상한 비단뱀 비교 while 루프 동작] (http://stackoverflow.com/questions/8914663/strange-python-while-loop- behavior-with-comparison? rq = 1). – DSM

+0

십진법 구성 요소가있는 대부분의 (실제로는?) 기본 10 숫자는 기본 2에 정확하게 저장할 수 없습니다. 실제로 .1base10 및 .01base10> 숫자를 처리하지 않으므로 이들과 함께 산술을 수행 할 때 그 (것)들에 전체로 정확하다. – chucksmash

답변

10

때문입니다.

What Every Computer Scientist Should Know About Floating-Point Arithmetic

가능한 해결 방법 :

>>> t_end = 100.0 
>>> t_step = 0.01 
>>> total = int(t_end/t_step) 
>>> for x in itertools.accumulate((t_step for i in range(total + 1))): 
    print(x) 

그래서 마지막 요소가 될 것입니다 : 100.01000000001426

당신은

당신이 읽어야 ... 평등을위한 부동 소수점 숫자를 비교해서는 안

+0

동일한 작업을 어떻게 수행합니까? – user1513100

+1

또는 약간 짧은 설명 : http://floating-point-gui.de/formats/fp/ – Lior

+0

@ user1513100 for 루프를 사용하여 원하는 단계 수를 정의 할 수 있습니다. – JBernardo

6

Floating point round-off error. 이것은 내가 내 마지막 세 값을 가지고 무엇을 :이 100.0 (합계의 결과가) 당신이 손으로 쓰기 100.0보다 클 수 있습니다

99.98000000001424 
99.99000000001425 
100.00000000001425 
3

이것은 부동 소수점 계산의 부정확성으로 인해 발생합니다. == 연산자를 사용하여 두 개의 부동 소수점 값을 비교합니다.이 값은 이동하지 않습니다. '100.0'으로 표시되는 내용은 실제로 '100.000000000314'와 같은 형태 일 수 있습니다.