numpy float的“ resolution”参数到底是什么

numpy float的“ resolution”参数到底是什么,第1张

numpy float的“ resolution”参数到底是什么

简短的回答是“
不要”混淆

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左右?

同样,在这种情况下,“分辨率”不考虑指数,仅考虑前面的部分。


希望这有助于澄清一些事情。所有这一切都有些混乱,每个人都在某个时候被它所咬。尝试建立一些直觉,并知道要调用哪些函数才能准确地在您的选择平台中找到,这是很好的!



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存