Python 은 어떻게 정확 한 부동 소수점 연산 을 실행 합 니까?

문제.
너 는 부동 소수점 에 대해 정확 한 계산 조작 을 실행 해 야 하 며,어떠한 작은 오차 도 발생 하 기 를 원 하지 않 는 다.
해결 방안
부동 소수점 의 보편적 인 문 제 는 십 진법 을 정확하게 표시 하지 못 한 다 는 것 이다.그리고 가장 간단 한 수학 연산 이라도 작은 오차 가 발생 할 수 있다.예 를 들 어:

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>
이러한 오 류 는 하부 CPU 와 IEEE 754 표준 이 자신의 부동 소수점 단 위 를 통 해 산술 을 수행 할 때의 특징 이다.Python 의 부동 소수점 데이터 형식 은 바 텀 을 사용 하여 데 이 터 를 저장 하 는 것 을 표시 하기 때문에 이러한 오 차 를 피 할 수 없습니다.
더 정확 하고 일정한 성능 손실 을 용인 할 수 있다 면 decimal 모듈 을 사용 할 수 있 습 니 다.

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True
처음에는 위의 코드 가 좀 이상 한 것 같 았 다.예 를 들 어 우 리 는 문자열 로 숫자 를 표시 했다.그러나 Decimal 대상 은 일반 부동 소수점 과 같은 작업(모든 상용 수학 연산 지원)을 합 니 다.인쇄 하거나 문자열 포맷 함수 에서 사용 하면 일반 숫자 와 다 를 바 없 을 것 같 습 니 다.
decimal 모듈 의 주요 특징 은 숫자 자릿수 와 반올림 연산 을 포함 하여 계산 을 제어 할 수 있 도록 하 는 것 이다.이렇게 하기 위해 서 는 로 컬 컨 텍스트 를 만 들 고 설정 을 변경 해 야 합 니 다.예 를 들 어:

>>> from decimal import localcontext
>>> a = Decimal('1.3')
>>> b = Decimal('1.7')
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
...   ctx.prec = 3
...   print(a / b)
...
0.765
>>> with localcontext() as ctx:
...   ctx.prec = 50
...   print(a / b)
...
0.76470588235294117647058823529411764705882352941176
>>>
토론 하 다.decimal모듈 은 IBM 의'통용 소수 연산 규범'을 실현 했다.말 할 것 도 없 이 이 책 은 언급 되 지 않 은 설정 옵션 이 많 습 니 다.
Python 초보 자 는 부동 소수점 의 정확 한 연산 을 처리 하기 위해decimal모듈 을 사용 하 는 경향 이 있다.그러나 응용 프로그램의 목적 을 먼저 이해 하 는 것 이 중요 하 다.만약 당신 이 과학 계산 이나 공학 분야 의 계산,컴퓨터 그래 픽,또는 과학 분야 의 대부분 연산 을 하고 있다 면 일반적인 부동 소수점 유형 을 사용 하 는 것 은 비교적 보편적 인 방법 입 니 다.그 중 하 나 는 실제 세계 에서 일반 부동 소수점 이 제공 할 수 있 는 17 비트 정도 의 정밀 도 를 요구 하 는 경 우 는 드물다 는 것 이다.따라서 계산 과정 에서 의 약간의 오 차 는 허용 된다.두 번 째 는 원생 의 부동 소수점 계산 이 훨씬 빠르다 는 것 이다.-가끔 은 대량의 연산 을 수행 할 때 속도 도 매우 중요 하 다.
그럼 에 도 불구 하고 오 차 를 완전히 무시 해 서 는 안 된다.수학자 들 은 여러 가지 알고리즘 을 연구 하 는 데 많은 시간 을 들 였 는데,어떤 처리 오 차 는 다른 방법 보다 더 좋 을 것 이다.너 도 감법 삭제 와 대수 와 소수 의 가산 점 연산 이 가 져 온 영향 에 주의해 야 한다.예 를 들 면:

>>> nums = [1.23e+18, 1, -1.23e+18]
>>> sum(nums) # Notice how 1 disappears
0.0
>>>
위의 오 류 는math.fsum() 이 제공 한 더욱 정확 한 계산 능력 을 이용 하여 해결 할 수 있다.

>>> import math
>>> math.fsum(nums)
1.0
>>>
그러나 다른 알고리즘 에 대해 서 는 그것 을 자세히 연구 하고 오차 발생 원 을 이해 해 야 한다.
전체적으로 말 하면 decimal 모듈 은 주로 금융 과 관련 된 분야 에 사용 된다.이런 프로그램 에 서 는 작은 오차 라 도 계산 과정 에서 만연 하 는 것 은 허용 되 지 않 는 다.따라서decimal모듈 은 이런 문 제 를 해결 하 는 데 방법 을 제공 했다.Python 과 데이터 베 이 스 를 만 날 때 도 Decimal 대상 을 만 나 고 금융 데 이 터 를 처리 할 때 도 많 습 니 다.
이상 은 Python 이 정확 한 부동 소수점 연산 을 어떻게 수행 하 는 지 에 대한 상세 한 내용 입 니 다.Python 이 정확 한 부동 소수점 연산 을 수행 하 는 지 에 관 한 자 료 는 우리 의 다른 관련 글 에 주목 하 십시오!

좋은 웹페이지 즐겨찾기