如何防止浮点数不精确影响numpy.arange?

2024-01-20

Because numpy.arange() https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html uses ceil((stop - start)/step)判断物品数量,小浮点不精确(stop = .400000001)可以将非预期值添加到列表中。

Example

第一种情况不包含停止点(故意的)

>>> print(np.arange(.1,.3,.1))
[0.1 0.2]

第二种情况包括停止点(不打算)

>>> print(np.arange(.1,.4,.1))
[0.1 0.2 0.3 0.4]

numpy.linspace() https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html解决这个问题,np.linspace(.1,.4-.1,3)。但要求您知道步数。np.linspace(start,stop-step,np.ceil((stop-step)/step))导致同样的不一致。

Question

我怎样才能生成可靠的float范围内不知道范围内的元素数量?

极端案例

考虑我想要生成未知精度的浮点索引的情况

np.arange(2.00(...)001,2.00(...)021,.00(...)001)

你的目标是计算什么ceil((stop - start)/step)如果这些值是用精确的数学计算出来的。

这是不可能做到的only的浮点值start, stop, and step这些是可能发生一些舍入错误的运算结果。舍入会删除信息,并且根本无法因缺乏信息而创建信息。

因此,只有当您有关于以下内容的附加信息时,此问题才可以解决:start, stop, and step.

Suppose step是准确的,但是start and stop有一些累积误差e0 and e1。也就是说,你知道start至多是e0远离其理想的数学值(在任一方向),并且stop至多是e1远离其理想值(在任一方向)。那么理想值(stop-start)/step范围可以是(stop-start-e0-e1)/step to (stop-start+e0+e1)/step远离其理想值。

假设之间有一个整数(stop-start-e0-e1)/step to (stop-start+e0+e1)/step。那么就无法知道是否理想ceil结果应该是浮点值中较小的整数或较大的整数start, stop, and step和界限e0 and e1.

然而,从你给出的例子来看,理想的(stop-start)/step可以恰好是一个整数,如(.4-.1)/.1。如果是这样,任何非零误差范围都可能导致误差区间跨越整数,从而使我们目前掌握的信息无法解决该问题。

因此,为了解决问题,您必须拥有更多信息,而不仅仅是错误的简单界限。例如,你必须知道(stop-start)/step恰好是一个整数或者以其他方式量化。例如,如果您知道步数的理想计算会产生 0.1 的倍数,例如 3.8、3.9、4.0、4.1 或 4.2,但绝不会是 4.05,并且误差足够小,以至于浮动 -点计算(stop-start)/step最终误差小于 0.05,则可以四舍五入(stop-start)/step到最接近的合格倍数,然后申请ceil对此。

如果您有此类信息,您可以用您对以下错误的了解来更新问题start, stop, and step (e.g.,也许它们中的每一个都是从十进制到浮点数的单次转换的结果)以及理想的可能值(stop-start)/step。如果您没有此类信息,则没有解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止浮点数不精确影响numpy.arange? 的相关文章