2012-09-25 1 views
2

가능한 중복 : 여기 파이썬 2.7을 사용하여
Floating Point Limitations파이썬 쉘 - "엑스트라"를 플로트 빼기에

.

누군가 껍질에서 이런 일이 일어나는 이유를 설명 할 수 있습니까?

>>> 5.2-5.0 
0.20000000000000018 
올바른 결과 (매우 작은 수와 매우 큰 수)를 생산하지 수의 서로 다른 스케일에 대한 굴복 물건을 검색

하지만 꽤 일반적인 듯, 내가 사용하고 숫자를 고려하고는 동일의입니다 규모가 크지 않기 때문에 그렇게 생각하지 않습니다.

편집 : 나는 "이 일이 일어나고있다"는 뜻을 내리지 않았는데 단순히 0.2가 아닌 0.2 ... 018을 반환한다는 것을 의미한다고 생각합니다. 그 인쇄물을 얻었고 코드 스 니펫에서 인쇄 부분을 삭제했습니다. 오해의 소지가 있습니다.

+0

이 질문에 대한 세 부분이 정말있다가 : "왜 5.2 '입니다 - = 0.2' 5.0", ""왜 표현을 인쇄로 동일한 작업을 수행하지 평가 않습니다 "을하는 이유/방법에 repr 및 STR 있습니다 다른"? 내 대답은 1 부에 초점을 맞추고, 애쉬 위니 Chaudhary의 2 부에 대한 완벽한 해답이며, 마티 피에 터스의 멋지게 3. – abarnert

+0

이 http://docs.python.org/tutorial/floatingpoint.html를 참조 부분을 처리합니다. 그것은 Goldberg 논문보다 이슈에 대한 훨씬 더 친절한 소개입니다. –

답변

5

당신은 5.2-5.0 정말 0.20000000000000018하지 0.2 것을 이해할 필요가있다. 이에 대한 표준 설명은 What Every Computer Scientist Should Know About Floating-Point Arithmetic에 나와 있습니다.

모든 것을 읽지 않으려면 컴퓨터가 실제 숫자에 가까워 질 때까지 5.2, 5.0 및 0.20000000000000018을 모두 근사치로 받아들입니다.

파이썬은 모든 컴퓨터 과학자가 알고 아직도 도망가해야 무엇인지 할 수 있도록 몇 가지 트릭을 가지고있다. 주요 트릭 str(f) - 그건이 있다는 것입니다, 수-12 개 유효 숫자립니다 부동 소수점의 사람이 읽을 수있는 연주, 그래서 str(5.2-5.0)"0.2"하지 "0.20000000000000018"입니다. 하지만 가끔은 그렇게 repr(f) - 그건, 당신이 얻을 수있는 모든 정밀도를 필요로하는 기계 판독 연주-, 그래서 repr(5.2-5.0)"0.20000000000000018"하지립니다.

지금 이해하는 것이 남아있는 유일한 것은 인터프리터 쉘이하는 일이다. Ashwini Chaudhary가 설명했듯이 쉘에서 무언가를 평가하는 것만으로 repr을 출력하고 print 문은 str을 출력합니다.

1

기본 구현 float.__str__은 출력을 12 자리로 제한합니다.

따라서 최소 유효 자릿수가 삭제되고 남아있는 값은 0.2입니다.

은 (가능한 경우) 이상의 숫자를 인쇄 string formatting 사용하려면

print '%f' % result # prints 0.200000 

그 기본값으로 6 자리를,하지만 당신은 더 정밀 지정할 수 있습니다

print '%.16f' % result # prints 0.2000000000000002 

는 다른 방법으로, 파이썬은 string formatting method 새로운 제안을 too

print '{0:.16f}'.format(result) # prints 0.2000000000000002 

왜 파이썬이 생산합니까 첫 번째 장소의 부정확 한 결과는 floating point arithmetic의 부정확 한 성격과 관련이 있습니다.

>>> from decimal import * 
>>> getcontext().prec = 1 
>>> Decimal(5.2) - Decimal(5.0) 
Decimal('0.2') 
2

repr() 사용 :

In [1]: print repr(5.2-5.0) 
0.20000000000000018 

In [2]: print str(5.2-5.0) 
0.2 

In [3]: print 5.2-5.0 
0.2 
+0

사과 드리며, 제 질문을 분명히하지 않았습니다. 5.2-5.0이 단순히 0.2가되지 않는 이유를 알고 싶습니다. – musketeer925

0

파이썬은 문자열의 __str____repr__ 방법에 개체를 변환하는 두 가지 방법이 있습니다 당신이 예측 정밀도를 필요로하는 경우 대신 decimal module를 사용합니다. __str__은 일반적인 문자열 출력을 의미하며 print에 의해 사용됩니다. __repr__은보다 정확한 표현이며, print을 사용하지 않거나 목록이나 사전의 내용을 인쇄 할 때 표시되는 내용입니다. __str__은 부동 소수점 값을 반올림합니다. 감산의 결과가 실제보다 정확하게 0.20000000000000018 0.2 이유로서는

, 그것은 부동 소수점의 내부 표현과 관련이있다. 무한히 반복되는 이진수이기 때문에 5.2를 나타내는 것은 불가능합니다. 당신이 올 수있는 가장 가까운 것은 약 5.20000000000000018입니다.

관련 문제