Python 浮动精度32

Python 浮动精度32,python,numpy,floating-point,floating-accuracy,Python,Numpy,Floating Point,Floating Accuracy,为了减小文件大小,我尝试将float64数据保存到float32中的文件中。数据值通常在1e-12到10之间。我在将float64转换为float32时测试了精度损失 print np.finfo('float32') 显示 看起来float32的分辨率为1e-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.d

为了减小文件大小,我尝试将
float64
数据保存到
float32
中的文件中。数据值通常在1e-12到10之间。我在将
float64
转换为
float32
时测试了精度损失

print np.finfo('float32')
显示

看起来
float32
的分辨率为
1e-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')))))
结果是

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
提出的高于1e-38、低于
1e-6
的值,相对误差在
1e-8
的顺序,即使该值低于
np.finfo
tiny
值,误差仍然可以接受


看起来在
float32
中保存数据是安全的,但我很好奇测试结果是否与
np.finfo
的结果不一致

低的数字在低于正常的范围内。基本上,指数没有足够的范围来得到足够低的值,因此随着值的降低,你会逐渐失去有效位。这被称为“逐渐下溢”


由于机器浮点ε为1.1920929e-07,舍入将使相对误差在正常浮点的一半以内:5.9604645e-8。但是,当小于1.1754944e-38时,则为非规范化数字,其绝对误差为1.4012985e-45

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