Python에서 부동 소수점 오류 방지
프로그래밍 영역에서는 부동 소수점 계산의 복잡성을 이해하는 것이 중요합니다. 제대로 처리하지 않으면 예상치 못한 오류가 발생합니다. 이 문서에서는 부동 소수점 연산의 함정을 강조하는 실용적인 예를 살펴봅니다.
제곱근 문제
제곱근을 근사하도록 설계된 Python 함수를 고려하세요.
def sqrt(num):
root = 0.0
while root * root 이 함수를 사용하면 놀라운 결과가 나타납니다:
>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998
부동 소수점 산술은 이러한 부정확성을 설명합니다. 분수를 표현할 때 컴퓨터는 분수와 지수의 조합으로 분수를 저장합니다. 이 표현의 제한으로 인해 특정 십진수 값을 정확하게 표현할 수 없어 근사값이 발생합니다.
오류 이해
위 코드에서 문제는 루트 값을 증가시키는 데 사용되는 증분입니다. 0.01 값을 추가하려고 하지만 부동 소수점 레지스터에 저장된 실제 값은 약간 다르며 0.01보다 큽니다.
오류 해결
피하려면 부동 소수점 오류의 경우 다양한 접근 방식을 사용할 수 있습니다.
- 10진수 사용 모듈:
Python의 Decimal 모듈은 보다 정확한 십진수 산술을 제공합니다. 코드에서 float를 Decimal로 바꾸면 더 정확한 결과를 얻을 수 있습니다.
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root
Now, the function returns precise results, such as:
```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
- 비 부동 소수점 증분 사용:
Decimal 모듈을 사용하는 것이 옵션이 아닌 경우, 또 다른 접근 방식은 이진수로 정확하게 표현할 수 있는 부동 소수점 값을 사용하는 것입니다. 1/2**J와 같은 것입니다. 여기에는 더 복잡한 코드가 포함되지만 정확한 증분을 보장합니다. - 수치 분석 기법 사용:
수치 분석은 복잡한 수학적 계산을 처리하기 위한 특수 방법을 제공합니다. 뉴턴의 방법과 같은 기술은 정확한 제곱근 근사치를 제공할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3