복붙노트

[PYTHON] 부동 소수점 오류를 방지하는 방법?

PYTHON

부동 소수점 오류를 방지하는 방법?

저는 제곱근을 근사화하는 함수를 작성하려고했습니다. (수학 모듈이 있다는 것을 알고 있습니다 ... 직접하고 싶습니다.) 부동 소수점 산술에 의해 엉망이되었습니다. 어떻게 피할 수 있니?

def sqrt(num):
    root = 0.0
    while root * root < num:
        root += 0.01
    return root

이것을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998

나는 round ()를 사용할 수 있다는 것을 알았지 만, 이것을 정확하게 할 수 있기를 바란다. 나는 6 자리 또는 7 자리로 계산할 수 있기를 원합니다. 내가 반올림하면 그건 불가능 해. 파이썬에서 부동 소수점 계산을 올바르게 처리하는 방법을 알고 싶습니다.

해결법

  1. ==============================

    1.이것은 파이썬과는 아무런 관련이 없습니다. 하드웨어의 바이너리 부동 소수점 연산을 사용하여 모든 언어에서 동일한 동작을 볼 수 있습니다. 먼저 문서를 읽으십시오.

    이것은 파이썬과는 아무런 관련이 없습니다. 하드웨어의 바이너리 부동 소수점 연산을 사용하여 모든 언어에서 동일한 동작을 볼 수 있습니다. 먼저 문서를 읽으십시오.

    그것을 읽은 후 코드의 1/100을 추가하지 않는다는 것을 더 잘 이해할 것입니다. 이것은 정확하게 당신이 추가하고있는 것입니다 :

    >>> from decimal import Decimal
    >>> Decimal(.01)
    Decimal('0.01000000000000000020816681711721685132943093776702880859375')
    

    이 문자열은 정확한 10 진수 값 0.01에 이진 부동 ( "double precision"C) 근사의 정확한 십진수 값을 보여줍니다. 당신이 실제로 추가하는 것은 1/100보다 약간 큰 것입니다.

    부동 소수점 수치 오류를 제어하는 ​​것은 "수치 해석"이라는 분야이며, 매우 크고 복잡한 주제입니다. 부동 소수점은 십진수 값의 근사치에 불과하다는 사실에 깜짝 놀랐다면 십진수 모듈을 사용하십시오. 그것은 당신에게 "얕은"문제의 세계를 빼앗아 갈 것입니다. 예를 들어, 함수를 약간 수정하면 다음과 같습니다.

    from decimal import Decimal as D
    
    def sqrt(num):
        root = D(0)
        while root * root < num:
            root += D("0.01")
        return root
    

    그때:

    >>> sqrt(4)
    Decimal('2.00')
    >>> sqrt(9)
    Decimal('3.00')
    

    실제로는 더 정확하지는 않지만 간단한 예에서는 그다지 놀랍지 않을 수 있습니다. 이제 정확히 1/100 정도를 추가하기 때문입니다.

    또 다른 방법은 부동 소수점을 고수하고 이진 부동 소수점으로 정확하게 표현할 수있는 값을 추가하는 것입니다. I / 2 ** J 형식의 값. 예를 들어, 0.01을 더하는 대신 0.125 (1/8) 또는 0.0625 (1/16)를 더하십시오.

    다음 제곱근을 계산하기위한 "Newton 's method"를 찾으십시오 ;-)

  2. from https://stackoverflow.com/questions/19473770/how-to-avoid-floating-point-errors by cc-by-sa and MIT license