>  기사  >  백엔드 개발  >  Python에서 부동 소수점 오류를 완화하는 방법은 무엇입니까?

Python에서 부동 소수점 오류를 완화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-21 15:08:30812검색

How to Mitigate Floating Point Errors in Python?

Python에서 부동 소수점 오류 방지

프로그래밍 영역에서는 부동 소수점 계산의 복잡성을 이해하는 것이 중요합니다. 제대로 처리하지 않으면 예상치 못한 오류가 발생합니다. 이 기사에서는 부동 소수점 연산의 함정을 강조하는 실용적인 예를 살펴봅니다.

제곱근 문제

제곱근을 근사화하도록 설계된 Python 함수를 고려해보세요.

<code class="python">def sqrt(num):
    root = 0.0
    while root * root < num:
        root += 0.01
    return root

이 기능을 사용하면 놀라운 결과가 나타납니다.

>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998</code>

부동 소수점 산술은 이러한 부정확성을 설명합니다. 분수를 표현할 때 컴퓨터는 분수와 지수의 조합으로 분수를 저장합니다. 이 표현의 제한으로 인해 특정 십진수 값을 정확하게 표현할 수 없어 근사치가 나옵니다.

오류 이해

위 코드에서 문제는 루트 값을 증가시키는 데 사용되는 증분입니다. 0.01이라는 값을 추가하려고 하지만 부동 소수점 레지스터에 저장된 실제 값은 약간 다르며 0.01보다 큽니다.

오류 해결

피하려면 부동 소수점 오류가 있는 경우 다양한 접근 방식을 사용할 수 있습니다.

  • Decimal 모듈 사용:
    Python의 Decimal 모듈은 더 정확한 소수 연산을 제공합니다. 코드에서 float를 Decimal로 바꾸면 더 정확한 결과를 얻을 수 있습니다.
<code class="python">from decimal import Decimal as D

def sqrt(num):
    root = D(0)
    while root * root < num:
        root += D("0.01")
    return root
Now, the function returns precise results, such as:

```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
</code>
  • 비부동 소수점 증분 사용:
    If Decimal 모듈을 사용하는 것은 옵션이 아니며, 또 다른 접근 방식은 1/2**J와 같이 이진수로 정확하게 표현할 수 있는 부동 소수점 값을 사용하는 것입니다. 여기에는 코드가 더 복잡하지만 정확한 증가가 보장됩니다.
  • 수치 분석 기술 사용:
    수치 분석은 복잡한 수학적 계산을 처리하기 위한 특수 방법을 제공합니다. 뉴턴 방법과 같은 기술은 정확한 제곱근 근사치를 제공할 수 있습니다.

위 내용은 Python에서 부동 소수점 오류를 완화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.