[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/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"를 찾으십시오 ;-)
from https://stackoverflow.com/questions/19473770/how-to-avoid-floating-point-errors by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 빈 목록 인 기본 매개 변수를 피하는 비법은 무엇입니까? (0) | 2018.10.12 |
---|---|
[PYTHON] 서브 프로세스가 실행되는 동안 stdout 인터셉트 (0) | 2018.10.12 |
[PYTHON] 다른 목록에 따라 목록을 정렬하는 방법? (0) | 2018.10.12 |
[PYTHON] 파이썬 2.6에서 쓰레드 안전 프린트를 얻으려면 어떻게해야합니까? (0) | 2018.10.12 |
[PYTHON] Selenium Python API 바인딩을 사용하여 Chrome에서 console.log 출력 얻기 (0) | 2018.10.12 |