부동 소수점 오류를 어떻게 처리하고 해결할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-10-21 14:57:03
원래의
542명이 탐색했습니다.

How Can We Handle and Resolve Floating-Point Errors?

부동 소수점 오류 및 해결 방법 이해

부동 소수점 연산은 대략적인 특성으로 인해 독특한 문제를 제기합니다. 이러한 오류를 효과적으로 해결하려면 근본 원인을 조사해야 합니다.

Python에서 부동 소수점 계산은 이진수 표현을 활용하므로 부정확성이 발생합니다. 코드 조각에서 볼 수 있듯이 제곱근을 근사화하려는 시도는 이 근사치로 인해 약간 벗어났습니다. 예:

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

print(sqrt(4)) # Output: 2.0000000000000013
print(sqrt(9)) # Output: 3.00999999999998</code>
로그인 후 복사

이러한 오류를 더 잘 이해하려면 소수 모듈을 사용하여 0.01의 정확한 소수 표현을 고려하십시오.

<code class="python">from decimal import Decimal
print(Decimal(.01)) # Output: Decimal('0.01000000000000000020816681711721685132943093776702880859375')</code>
로그인 후 복사

이 문자열은 추가되는 실제 값이 약간 있음을 나타냅니다. 1/100보다 큽니다. 따라서 소수 값의 부동 소수점 표현에는 이러한 사소한 변형이 발생합니다.

이러한 오류를 완화하기 위해 여러 가지 접근 방식이 있습니다.

  1. 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

print(sqrt(4)) # Output: Decimal('2.00')
print(sqrt(9)) # Output: Decimal('3.00')</code>
로그인 후 복사
  1. 제어 가능한 증분: 0.01을 직접 추가하는 대신 정확하게 표현할 수 있는 값을 추가하는 것이 좋습니다. I/2**J와 같은 이진 부동 소수점으로. 0.125(1/8) 또는 0.0625(1/16) 증분을 사용하면 근사 오류가 제거됩니다.

이러한 방법을 결합하고 뉴턴 방법과 같은 기술을 활용하면 매우 정확한 부동을 얻을 수 있습니다. 소수점 계산을 통해 수치 분석에 대한 이해를 넓히고 부동 소수점 연산을 효과적으로 처리할 수 있습니다.

위 내용은 부동 소수점 오류를 어떻게 처리하고 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!