2008-09-27 5 views
5

그래서 저는 저의 문제를 해결하기 위해 파이썬 스크립트를 작성하여 물리학 과제를 풀기로했습니다. 필자가 중점적으로 다루는 한 가지 문제점은 중요한 인물이 항상 제대로 나오지 않는 것입니다.십진법 모듈의 중요한 수치

from decimal import Decimal 
>>> Decimal('1.0') + Decimal('2.0') 
Decimal("3.0") 

을하지만이되지 않습니다 : 예를 들어이 제대로 유효 숫자를 처리

>>> Decimal('1.00')/Decimal('3.00') 
Decimal("0.3333333333333333333333333333") 

그래서 두 가지 질문 :

  1. 가 있습니까 I이 예상되는 금액하지 못했습니다 것을 유효 자릿수를 입력하거나 중요한 자릿수를 계산해야합니까?
  2. 십진법 정밀도를 수동으로 설정하지 않고도이를 수행 할 수있는 방법이 있습니까? 물론, numpy를 사용하여이 작업을 수행 할 수는 있지만, 호기심 때문에 십진수 모듈로이를 수행 할 수있는 방법이 있는지 알고 싶습니다.

답변

8

10 진수 정밀도를 2 자리로 변경하면 이 아니라이됩니다. 단 하나의 조작 만 절대 수행하지 않는 한 좋은 생각입니다.

항상 중요도 레벨보다 높은 정밀도로 계산을 수행하고 최종 결과를 반올림해야합니다. 긴 계산 순서를 수행하고 각 단계에서 유효 자릿수로 반올림하면 오류가 누적됩니다. 10 진수 모듈은 특정 조작이 긴 순서 또는 최종 결과인지 여부를 알지 못하 G로 필요 이상으로 반올림하지 않아야한다고 가정합니다. 이상적으로는 무한 정밀도를 사용하지만, 너무 비싸서 파이썬 개발자는 28 자리로 정산합니다.당신이 최종 결과에 도착하면

는 당신이 아마 원하는 것은 퀀 타이즈입니다 : 수동 의미를 추적해야

 
>>> (Decimal('1.00')/Decimal('3.00')).quantize(Decimal("0.001")) 
Decimal("0.333") 

. 자동 유의성 추적을 원할 경우 구간 산술을 사용해야합니다. pyintervalmpmath (임의 정밀도 지원)을 비롯하여 Python에서 사용할 수있는 라이브러리가 있습니다. 십진법 라이브러리와의 구간 산술을 구현하는 것도 직접적인 반올림을 지원하기 때문에 직관적입니다.

또한 그냥 호기심 밖으로 Decimal Arithmetic FAQ: Is the decimal arithmetic ‘significance’ arithmetic?

+0

300/100은 어떨까요? 3.000으로 코드가 잘못 생성 될 수 있습니다. – Pyrolistical

0

10 진수의 기본값은 28 자리입니다.
반환하는 자릿수를 제한하는 유일한 방법은 정밀도를 변경하는 것입니다.

+0

항상 그렇지는 않습니다. 예 : >>> Decimal ('1.0') * Decimal ('1.0')은 Decimal ("1.00")을 산출합니다. –

2

십진수는 소수점 이하를 버리지 않습니다. 정밀도를 2 d.p로 제한하고 싶다면 다음

decimal.getcontext().prec=2 

편집을 시도 : 당신은 선택적으로 호출 할 수 있습니다 퀀 타이즈()는 곱하거나 나누기 (덧셈과 뺄셈은 2 DPS를 유지한다)마다.

+0

흠 ... 수동으로 정밀도를 설정하지 않아도 그렇게 할 방법이 없습니다. –

0

정확하게 10 진수를 사용하면 "정밀도"는 소수점 이하 자릿수이므로 십진수 표기로입니다.

다른 것을 원할 것 같습니다 : 유효 자릿수입니다. 소수점 이하 자릿수는 이고 과학 표기는입니다.

중요한 숫자를 인식하는 부동 소수점 계산을 수행하는 Python 모듈에 대해 배우고 싶습니다.

0

부동 소수점에 어떤 문제가 있습니까?

>>> "%8.2e"% (1.0/3.0) 
'3.33e-01' 

제한된 유효 자릿수가있는 과학적 계산을 위해 설계되었습니다.

+0

문제는 여전히 유효 숫자의 수를 수동으로 설정한다는 것입니다. –

+0

유효 자릿수 설정이 어떻게 문제가되는지 알지 못합니다. 원하는 것을 보여주고 질문의 유효 숫자를 설정하지 않으려는 이유를 보여주기 위해 질문을 확장해야합니다. –

1

을 읽을 수 있습니다 ... 그것은 소수 모듈을 사용하는 것이 필요하다? 중요한 숫자가 숫자를 반올림하는 부동 소수점을 볼 준비가 된 이유는 무엇입니까? 또는 계산 결과의 오류를 분석하고 계산 된 오류를 계산에 포함 된 불확실성의 함수로 계산해야 할 때와 같이 계산의 유효 숫자를 추적하려고합니까? 당신이 그들을 인쇄하거나 문자열로 변환 할 때

def lround(x,leadingDigits=0): 
    """Return x either as 'print' would show it (the default) 
    or rounded to the specified digit as counted from the leftmost 
    non-zero digit of the number, e.g. lround(0.00326,2) --> 0.0033 
    """ 
    assert leadingDigits>=0 
    if leadingDigits==0: 
      return float(str(x)) #just give it back like 'print' would give it 
    return float('%.*e' % (int(leadingDigits),x)) #give it back as rounded by the %e format 

숫자가 올바르게 표시되지만에서 근무 당신이하는 경우 : 대신 적절한 수의 왼쪽에서 반올림 반올림 기능을 원하는 경우에, 시도 메시지를 명시 적으로 인쇄하지 않으면 조금 이상하게 보일 수 있습니다.

>>> lround(1./3.,2),str(lround(1./3.,2)),str(lround(1./3.,4)) 
(0.33000000000000002, '0.33', '0.3333')