python 에서 정확 한 부동 소수점 연산 상세 해 를 실현 합 니 다.
본 고 를 시작 하기 전에 부동 소수점 이 왜 정확성 이 부족 한 지 에 대해 이야기 합 시다.사실은 이것 은 Python 의 문제 가 아니 라 실수 의 무한 정밀도 와 컴퓨터 의 유한 메모리 간 의 모순 입 니 다.
예 를 들 어 만약 에 제 가 정수 만 사용 할 수 있다 면(즉,한 자리 까지 만 정확 하고 컴퓨터 안의 부동 소수점 도 유한 한 정밀도 만 있 습 니 다.C 언어 중의 이중 정밀도 부동 소수점 double 을 예 로 들 면 정밀도 가 52 개의 이 진 비트)이 고 임 의 실수(무한 정밀도)를 표시 하려 면 반올림(rounding)을 통 해 비슷 하 게 표시 할 수 밖 에 없습니다.
예 를 들 어 1,2,4 는 2,3,6 은 4 로 표시 합 니 다.
그래서?
1.2-1.2 를 계산 할 때 컴퓨터 가 표시 하 는 문제 로 인해 내 가 계산 한 것 은 사실상 1-1 이 었 고 결 과 는 0 이 었 는데 공교롭게도 맞 았 다.
1.2+1.2-2.4 를 계산 할 때 컴퓨터 가 표시 하 는 문제 로 인해 제 가 계산 한 것 은 실제로 1+1-2 이 고 결 과 는 0 이 었 습 니 다.다시 맞 혔 습 니 다.
하지만 1.2+1.2+1.2-3.6 을 계산 할 때 컴퓨터 가 표시 하 는 문제 로 인해 제 가 계산 한 것 은 실제로 1+1+1-4 입 니 다.결 과 는-1 입 니 다.운 이 그렇게 좋 지 않 았 습 니 다!
여기 있 는 1.2,2.4,3.6 은 당신 문제 의 0.1,0.2 와 0.3,1,2,4 는 진정 으로 컴퓨터 내부 에서 연산 하 는 수치 입 니 다.제 가 분명히 말 했 습 니까?
기타 IEEE 754 부동 소수점 기준,예 를 들 어 CSAPP 제2 장 같은 것 을 보 세 요.
또한 부동 소수점 뿐만 아니 라 컴퓨터 내부 에서 의 표시 에 오차 가 있 을 뿐만 아니 라 연산 자체 에 도 오차 가 있 을 수 있 습 니 다.예 를 들 어 정수 2 는 컴퓨터 에서 정확하게 표시 할 수 있 지만 근호 2 를 계산 하면 오차 가 있다.그리고 예 를 들 어 두 개의 부동 소수점 을 나 누 면 원래 두 개의 수 는 모두 정확하게 표시 되 었 으 나 나 나 누 는 결과 의 정 도 는 컴퓨터 안의 실수 표시 범 위 를 초과 한 후에 오차 가 생 겼 다.
자,다음은 더 이상 말 하지 않 겠 습 니 다.본문의 본문 을 시작 하 겠 습 니 다.
시작 하 다
부동 소수점 의 보편적 인 문 제 는 십 진법 을 정확하게 표시 하지 못 한 다 는 것 이다.
>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>
밑바닥 CPU 와IEEE 754기준 이 자신의 부동 소수점 단 위 를 통 해 산술 을 수행 할 때의 특징 때문이다.가난 해 보 이 는 소수 가 컴퓨터 의 이 진 표시 에 서 는 무한 하 다.일반적으로 이 작은 오 차 는 존재 할 수 있다.이런 오차(예 를 들 어 금융 분야)를 용납 하지 못 한다 면 이 문 제 를 해결 하 는 방법 을 고려 해 야 한다.
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 Decimal, 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 의 높 은 정밀도 의 숫자 는 자 연 스 럽 게 문자열 로 전시 되 고 중 전 됩 니 다.총결산
전반적 으로 금융 분야 와 관련 될 때 작은 오차 라 도 계산 과정 에서 허용 되 지 않 는 다.따라서 decimal 모듈 은 이런 문 제 를 해결 하 는 방법 을 제공 했다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.