문제

그래서 나는 파이썬 스크립트를 작성하여 문제를 해결함으로써 물리학 숙제를 해결하기로 결정했습니다. 내가 달려가는 한 가지 문제는 중요한 수치가 항상 제대로 나오지 않는다는 것입니다. 예를 들어 이것은 중요한 수치를 올바르게 처리합니다.

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

그러나 이것은 그렇지 않습니다.

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

그래서 두 가지 질문 :

  1. 이것이 예상되는 숫자의 예상 금액이 아니라고 옳습니까, 아니면 중요한 숫자 수학을 중단해야합니까?
  2. 소수점 정밀도를 수동으로 설정하지 않고도이 작업을 수행 할 수있는 방법이 있습니까? 물론, 나는 numpy를 사용하여 이것을 할 수 있다고 확신하지만, 호기심에서 소수점 모듈로 이것을 할 수있는 방법이 있는지 알고 싶습니다.
도움이 되었습니까?

해결책

소수점 작업 정밀도를 2 자리로 변경하는 것은입니다 ~ 아니다 절대적으로 단일 작업을 수행하지 않는 한 좋은 생각입니다.

중요 수준보다 높은 정밀도로 계산을 수행해야하며 최종 결과 만 반올림해야합니다. 긴 계산 시퀀스를 수행하고 각 단계에서 유의 한 숫자 수로 반올림하면 오류가 축적됩니다. 십진 모듈은 특정 작업이 긴 순서의 하나인지 또는 최종 결과인지 여부를 알지 못하므로 필요 이상으로 반올림해서는 안된다고 가정합니다. 이상적으로는 무한한 정밀도를 사용하지만 너무 비싸서 파이썬 개발자가 28 자리에 정착했습니다.

최종 결과에 도착하면 아마도 원하는 것은 다음과 같습니다.

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

중요성을 수동으로 추적해야합니다. 자동 유의성 추적을 원한다면 간격 산술을 사용해야합니다. Python에 사용할 수있는 일부 라이브러리가 있습니다 pyinterval 그리고 mpmath (임의의 정밀도를 지원). 또한 Directed Rounding을 지원하기 때문에 Decimal Library와 Interval 산술을 구현하는 것도 간단합니다.

당신은 또한 읽고 싶을 수도 있습니다 십진 산술 FAQ : 소수점 산술 '중요'산술입니까?

다른 팁

소수점은 그와 같은 소수점을 버리지 않습니다. 정밀도를 2dp로 제한하고 싶다면 시도하십시오.

decimal.getcontext().prec=2

편집 : 배가되거나 분열 될 때마다 Quantize ()를 호출 할 수 있습니다 (추가 및 뺄셈은 2 dps를 보존합니다).

호기심이 없어 ... 소수 모듈을 사용해야합니까? 당신이 그들을 볼 준비가되었을 때 숫자가 숫자로 반올림 한 플로팅 포인트는 어떻습니까? 또는 계산의 중요한 그림을 추적하려고 노력하고 있습니까 (결과에 대한 오류 분석을 수행해야 할 때와 같이 계산에 들어간 불확실성의 함수로 계산 된 오류를 계산해야합니까? 오른쪽 대신 번호의 왼쪽에서 반올림하는 반올림 함수를 원한다면 다음과 같이 시도하십시오.

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')

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

제가 소수점을 올바르게 착수하면 "정밀"는 소수점 이후의 숫자 수입니다. 소수점 표기법.

당신은 다른 것을 원한 것 같습니다 : 중요한 숫자의 수. 그것은 소수점 이후의 숫자 수보다 하나 더 있습니다. 과학적 표기법.

나는 상당수 인식 플로팅 포인트 계산을하는 파이썬 모듈에 대해 배우는 데 관심이 있습니다.

부동 소수점에 무슨 문제가 있습니까?

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

제한된 수의 중요한 숫자로 과학 스타일 계산을 위해 설계되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top