2013-04-19 6 views
3

에서 처리 내가 파이썬에 비교적 새로운 해요 및 설명서 웹 사이트에 tutorial page을 통해 읽기,이 조각 건너 온 : enter image description here 이 날 궁금했다, 그래서 파이썬 파일에 입력하기로 결정 그것을 시험해보십시오. 내가 이런 짓을 할 때, 그러나, 그것은 나에게 다른 결과 준 :이 질문은 사소한 것처럼 보일 수 있습니다부동 소수점 평등 파이썬

.1+.1+.1 == .3 
=> True 

을하지만, 실제 동작은 파이썬 문서가 할 것이라고 말했다 일치하지 않았는지 궁금 해요. 어떤 대답?

online interpreter을 사용하는 동안이 동작이 발생했습니다. 로컬에서 실행하면 False가 반환됩니다.

+5

여기 키워드는 * 할 수 없습니다. 플랫폼의 부동 소수점 구현에 따라 다릅니다. –

+1

동일한 코드 행은 항상 동일한 결과를 내야합니까? –

+2

아니요, 안됩니다. 코드는 절대로 독립적으로 실행되지 않으며, 나오는 내용은 사용자가 입력 한 내용에 따라 다르며 Windows에서 실행중인 코드는 Unix 시스템에서 동일한 코드를 실행하는 것과는 다른 결과를 낼 수 있습니다. –

답변

2

실행중인 Python의 버전이 무엇인지 말한 적이 없으며 그 점이 큰 차이를 만들 수 있습니다. 산술은 시스템에 따라 일관성을 유지해야하는 IEEE 기반 복식 일 가능성이 큽니다. 그러나 CPython은 기반이되는 C 라이브러리를 기반으로하며 부동 소수점 상수가 입력 될 때이를 반올림하는 방식이 다를 수 있습니다. 다른 버전의 Python도 일부 기본 플랫폼에 종속됩니다.

편집 : 확인되었습니다. Windows에서

'%0.20f' % (.1+.1+.1,) 
=> '0.30000000000000004441' 
    '%0.20f' % (.3,) 
=> '0.30000000000000004441' 

파이썬 2.7을 사용 : 내가 얻을 질문에 주어진 온라인 인터프리터를 사용

>>> '%0.20f' % (.1+.1+.1,) 
'0.30000000000000004441' 
>>> '%0.20f' % (.3,) 
'0.29999999999999998890' 

그것은 온라인 통역을 표시 다르게 입력을 반올림합니다.

+0

파이썬 3.3을 실행 중입니다 - 파이썬 3은 파이썬 2와 다른 부동 소수점을 처리합니까? –

+0

@jarednielsen, 나는 그렇게 기대하지 않을 것이다. 그러나 그것은 좋은 정보 (감사) 다. –

+0

버전 2.7 이상에서는 CPython이 문자열을 부동 상태로 변환하고 문자열 변환으로 플로팅하는 고유 한 코드가 있습니다. 플랫폼은 차이를 만들어서는 안됩니다. –

1

첫 번째 의견은 답변입니다. 파이썬 문서에서

Python 2.7.3 (default, Sep 26 2012, 21:53:58) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 0.1+0.1+0.1 == 0.3 
False 
>>> 

(http://docs.python.org/2/tutorial/floatingpoint.html) : 내 시스템에서

이진 부동 소수점 연산이 같은 많은 놀라움을 보유하고 있습니다. "0.1"문제는 아래의 “Representation Error” 섹션에서 자세히 설명합니다. 기타 일반적인 놀라움에 대한보다 완전한 설명은 의 The Perils of Floating Point을 참조하십시오.

+0

입니다. 한 컴퓨터에서는 코드가 True를 반환하고 다른 코드에서는 False를 반환하는 요소는 무엇인지 알고 있습니까? –

+0

무엇이 중요합니까? 불일치에 대해 어떤 일도 실제로 할 수는 없으며, 어쨌든 적절하고 올바른 프로그래밍 방법은 이와 같은 결과에 신경 쓰지 않는 방식으로 코드를 작성하는 것입니다. –

+0

@jarednielsen이 답변 – ndpu

관련 문제