2011-07-29 7 views
4

단일 플로트에서 배열을 뺄 때 매우 작은 숫자 (1e-8보다 작은 값)를 자동으로 반올림하는 python 문제가 있습니다. 이 예제를 보자.파이썬에서 numpy 배열을 빼는 경우 원치 않는 반올림

import numpy as np 
float(1) - np.array([1e-10, 1e-5]) 

파이썬을 돌리지 않는 방법에 대한 의견이 있으십니까? 이것은 어떤 경우에는 제로로 나누고, 문제가되도록 강요합니다. numpy 배열에서 뺄 때 같은 문제가 발생합니다.

+0

나는 1의 제곱에 작은 숫자를 올리면서 똑같은 문제를 겪고 있으며, 0으로 반올림하는 것을 가지고있다. – mike

+1

당신이 downvote를 얻은 것은 ... 그것은 좋은 질문이다. –

답변

6

대부분, 그것은 당신을 속이고있어 NumPy와 배열의 repr이다 (물론, 당신은 등 공식을 다시 구현할 것을 피하기 위해 자동적으로 분수의 계산을 처리하는 몇 가지 클래스가 필요).

당신의 예는 위의 고려 :

import numpy as np 
x = float(1) - np.array([1e-10, 1e-5]) 
print x 
print x[0] 
print x[0] == 1.0 

이 수율 :

[ 1.  0.99999 ] 
0.99999999999 
False 

그래서 첫 번째 요소는 실제로 0이 아닌이 NumPy와 배열의 단지 예쁜 인쇄의 그런 식으로 보여주는 사용자들은 .

은 물론 numpy.set_printoptions.

는, NumPy와는 fundementally 제한 정밀 수레를 사용하여 제어 할 수 있습니다. numpy의 전체적인 점은 유사한 데이터 배열을위한 메모리 효율적인 컨테이너가 될 것이므로 numpy에 decimal 클래스의 해당 항목이 없습니다.

그러나 64 비트 부동 소수점은 괜찮은 정밀도 범위를 가지고 있습니다. 1e-10과 1e-5는 너무 많은 문제를 일으키지 않습니다. 필요한 경우 numpy.float128 dtype도 있지만 네이티브 수레를 사용하는 것보다 작업이 훨씬 느립니다.

+0

그 생각은하지 못했지만, 당신은 절대적으로 옳습니다. +1 – redShadow

1

나는 모든 것이 매우 작은 부동 소수점 숫자, 파이썬 및 기본 C 라이브러리의 처리에 달려 있다고 생각합니다. 특정 지점에서 정밀도가 느슨한 경향이 있습니다. 당신은 당신이 등 분수의 번호와 같은 다른 무언가에 의존해야 이럴 정밀도의 수준이 필요한 경우

나는 이미 그것을 처리 할 수있는 뭔가가 있는지 모르겠지만 당신은으로 관리 할 수 ​​있다면 (1/100000000001/100000과 같은) 숫자를 표현한 다음 모든 계산이 끝날 때만 부동 소수점 결과를 계산하면 이러한 모든 문제를 피할 수 있습니다.