2016-08-25 9 views
2

파일 크기를 줄이려면 데이터를 float32에 저장하려고합니다. 데이터 값은 일반적으로 1e-12에서 10까지입니다. float64float32으로 변환 할 때 정확도 손실을 테스트했습니다.float32의 정확도

print np.finfo('float32') 

Machine parameters for float32 
--------------------------------------------------------------- 
precision= 6 resolution= 1.0000000e-06 
machep= -23 eps=  1.1920929e-07 
negep = -24 epsneg=  5.9604645e-08 
minexp= -126 tiny=  1.1754944e-38 
maxexp= 128 max=  3.4028235e+38 
nexp =  8 min=  -max 
--------------------------------------------------------------- 

float321e-6의 해상도를 가지며, ABS 값 아래로 작은 1.2e-38 등을 유효 보인다 나타낸다.

import numpy as np 

x = 2.0*np.random.rand(100) - 1.0 # make random numbers in [-1, 1] 

print('x.dtype: %s'%(x.dtype)) # outputs float64 

print('number : max_error max_relative_error') 
for i in xrange(-40, 1): 
    y = x * 10**i 
    print('1e%-4d: %s'%(i, np.max(np.abs(y - y.astype('f4').astype('f8'))))) 

결과는 상대 오차 미만 1e-6np.finfo 제안한, 1E-38 위의 값 1e-8 순서에 있고 에러가 계속 허용

number: max_error  max_relative_error 
1e-40 : 6.915620e-46 6.915620e-06 
1e-39 : 6.910361e-46 6.910361e-07 
1e-38 : 6.949349e-46 6.949349e-08 
1e-37 : 4.816590e-45 4.816590e-08 
1e-36 : 4.303771e-44 4.303771e-08 
1e-35 : 3.518621e-43 3.518621e-08 
1e-34 : 5.165854e-42 5.165854e-08 
1e-33 : 3.660088e-41 3.660088e-08 
1e-32 : 3.660088e-40 3.660088e-08 
1e-31 : 4.097193e-39 4.097193e-08 
1e-30 : 4.615068e-38 4.615068e-08 
1e-29 : 3.696983e-37 3.696983e-08 
1e-28 : 2.999860e-36 2.999860e-08 
1e-27 : 4.723454e-35 4.723454e-08 
1e-26 : 3.801082e-34 3.801082e-08 
1e-25 : 3.062408e-33 3.062408e-08 
1e-24 : 4.876378e-32 4.876378e-08 
1e-23 : 3.779378e-31 3.779378e-08 
1e-22 : 3.144592e-30 3.144592e-08 
1e-21 : 4.991049e-29 4.991049e-08 
1e-20 : 3.949261e-28 3.949261e-08 
1e-19 : 3.002761e-27 3.002761e-08 
1e-18 : 5.162480e-26 5.162480e-08 
1e-17 : 4.135703e-25 4.135703e-08 
1e-16 : 3.282146e-24 3.282146e-08 
1e-15 : 4.722129e-23 4.722129e-08 
1e-14 : 3.863295e-22 3.863295e-08 
1e-13 : 3.375549e-21 3.375549e-08 
1e-12 : 4.011790e-20 4.011790e-08 
1e-11 : 4.011790e-19 4.011790e-08 
1e-10 : 3.392060e-18 3.392060e-08 
1e-9 : 5.471206e-17 5.471206e-08 
1e-8 : 4.072652e-16 4.072652e-08 
1e-7 : 3.496987e-15 3.496987e-08 
1e-6 : 5.662626e-14 5.662626e-08 
1e-5 : 4.412957e-13 4.412957e-08 
1e-4 : 3.482083e-12 3.482083e-08 
1e-3 : 5.597344e-11 5.597344e-08 
1e-2 : 4.620014e-10 4.620014e-08 
1e-1 : 3.540690e-09 3.540690e-08 
1e0 : 2.817751e-08 2.817751e-08 

되더라도 값하다면 값이 np.finfo보다 작아야합니다.

내 데이터를 float32에 저장하는 것이 안전 해 보이지만 테스트 결과가 np.finfo과 일치하지 않는 것으로 보입니까?

답변

4

낮은 숫자는 비정상 범위입니다. 기본적으로 지수는 충분히 낮아지기에 충분한 범위가 없기 때문에 값이 낮아짐에 따라 점차 중요한 비트를 잃게됩니다. 이를 "점진적 언더 플로"라고합니다. 기계 부동 소수점 엡실론 이후

https://en.wikipedia.org/wiki/Denormal_number

1

정상 수레에 대한 그의 절반 내에서 당신에게 상대 오차를 얻을 것 반올림, 1.1920929e-07 : 5.9604645e-8. 그러나 1.1754944e-38보다 작아지면 비정규 화 된 숫자가 생기고 절대 값은 1.4012985e-45가됩니다.