2013-11-22 4 views
3

NumPy 버전 1.7.1을 사용하고 있습니다. numpy 배열 작업 취소 (스칼라 포함)

>>> import numpy as np 
>>> a = np.array([ 883, 931, 874], dtype=np.float32) 

은 수학적으로 a+0.1-a0.1을해야한다 : 지금 내가 이해할 수없는 이상한 취소를 가로 질러왔다. 이제 의 값이 표현과 절대 및 상대 오차를 계산하자

>>> a+0.1-a 
array([ 0.09997559, 0.09997559, 0.09997559], dtype=float32) 
>>> (a+0.1-a)-0.1 
array([ -2.44155526e-05, -2.44155526e-05, -2.44155526e-05], dtype=float32) 
>>> ((a+0.1-a)-0.1)/0.1 
array([-0.00024416, -0.00024416, -0.00024416], dtype=float32) 

첫 번째 질문 : 이것은, 이것은 단지 치명적인 취소입니다, 꽤 높은 절대 및 상대 오차 그렇지?

두 번째 질문 :

>>> a+np.array((0.1,)*3)-a 
array([ 0.1, 0.1, 0.1]) 
>>> (a+np.array((0.1,)*3)-a)-0.1 
array([ 2.27318164e-14, 2.27318164e-14, 2.27318164e-14]) 

이 내가 생각 0.1 단지 숫자 표현입니다 : 내가 스칼라 대신 배열을 사용하는 경우, NumPy와는 훨씬 더 정밀하게 계산 상대적인 오류를 볼 수 있습니다.

그러나 a+0.1-a처럼 배열 대신 스칼라를 사용하면 NumPy가 이와 동일한 방식으로 처리 할 수 ​​없습니까?

답변

4

배정 밀도를 사용하면 시나리오가 변경됩니다. 당신이 받고하는 것은 단 정밀도 (np.float32) 예상된다

a = np.array([ 883, 931, 874], dtype=np.float64) 

a+0.1-a 
# array([ 0.1, 0.1, 0.1]) 

((a+0.1-a)-0.1)/0.1 
# array([ 2.27318164e-13, 2.27318164e-13, 2.27318164e-13]) 

식의 중간에 np.array((0.1,)*3)을 사용하여 두 번째 결과에서 높은 정밀도를 설명하는 float64 모든 것을 돌았 다.

+1

감사합니다. 암시 적 64 비트 유형을 보지 못했습니다! numpy는 "a + 0.1-a"로 64 비트를 취할 수 없다는 것을 알지 못합니다. – roettm