简短的回答是“
不要”混淆numpy.finfo
使用numpy.spacing
”。
finfo对
dtype进行
spacing运算,而对值进行运算。背景资料
首先,一些一般的解释:
要理解的关键部分是浮点数类似于科学计数法。就像您将0.000001写为一样
1.0 x 10^-6,浮点数类似于
c x2^q。换句话说,它们具有两个独立的部分-系数(
c又名“有效位数”)和指数(
q)。这两个值存储为整数。
因此,一个值可以被表示得多么紧密(让我们将其视为离散化程度)是两个部分的函数,并且 取决于该值的大小 。
但是,“精确度”(由表示
np.finfo)实际上是有效数字的数量,如果该数字是以10为基数的科学计数法表示的。“分辨率”是系数的分辨率(在前面的部分),如果该值以相同的10为基数的科学记号表示(即
10^-precision)。换句话说,两者仅是系数的函数。脾脏特定
对于
numpy.finfo,“精度”和“分辨率”只是彼此相反。 没有人告诉您一个特定数字的接近程度 。它们纯粹是的功能
dtype。
相反,如果您担心离散化的绝对程度,请使用
numpy.spacing(your_float)。这将以该特定格式返回下一个最大值的差(例如,a
float32与a不同
float64)。例子
举个例子:
In [1]: import numpy as npIn [2]: np.spacing(10.1)Out[2]: 1.7763568394002505e-15In [3]: np.spacing(10000000000.1)Out[3]: 1.9073486328125e-06In [4]: np.spacing(1000000000000.1)Out[4]: 0.0001220703125In [5]: np.spacing(100000000000000.1)Out[5]: 0.015625In [6]: np.spacing(10000000000000000.1)Out[6]: 2.0
但是精度和分辨率不会改变:
In [7]: np.finfo(10.1).precisionOut[7]: 15In [8]: np.finfo(10000000000000000.1).precisionOut[8]: 15In [9]: np.finfo(10.1).resolutionOut[9]: 1.0000000000000001e-15In [10]: np.finfo(10000000000000000000.1).resolutionOut[10]: 1.0000000000000001e-15
还要注意,所有这些都取决于您使用的数据类型:
In [11]: np.spacing(np.float32(10.1))Out[11]: 9.5367432e-07In [12]: np.spacing(np.float32(10000000000000.1))Out[12]: 1048576.0In [13]: np.finfo(np.float32).precisionOut[13]: 6In [14]: np.finfo(np.float32).resolutionOut[14]: 1e-06In [15]: np.spacing(np.float128(10.1))Out[15]: 8.6736173798840354721e-19In [16]: np.spacing(np.float128(10000000000000.1))Out[16]: 9.5367431640625e-07In [17]: np.finfo(np.float128).precisionOut[17]: 18In [18]: np.finfo(np.float128).resolutionOut[18]: 1.0000000000000000007e-18
具体问题
现在开始您的具体问题:
但是实际上,这是否意味着如果我使用小于分辨率的数字来执行运算,那我应该期望结果是错误的吗?
否,因为精度/分辨率(
numpy.finfo就术语而言)仅是系数的函数,而没有考虑指数。非常小的和非常大的数字具有相同的“精度”,但这并不是绝对的“错误”。
根据经验,使用的“分辨率”或“精度”术语时
finfo,请想到科学计数法。如果我们使用数量级相近的少量数据进行 *** 作,则无需担心太多。
让我们以具有6个有效数字的十进制数学形式为例(有点类似于
float32):
1.20000 x 10^-19 + 2.50000 x 10^-20 => 1.45000 x 10^19
但是,如果我们对数量级有很大不同但精度有限(同样是6个有效数字)的数字进行运算:
1.20000 x 10^6 + 2.50000 x 10^-5 => 1.20000
我们将开始很清楚地看到效果。
给定精度,我如何量化两个浮点数的误差(例如,加法)?
使用
np.spacing(result)。
如果分辨率与1e-15一样“大”,为什么最小允许数字在1e-308左右?
同样,在这种情况下,“分辨率”不考虑指数,仅考虑前面的部分。
希望这有助于澄清一些事情。所有这一切都有些混乱,每个人都在某个时候被它所咬。尝试建立一些直觉,并知道要调用哪些函数才能准确地在您的选择平台中找到,这是很好的!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)