Bre*_*ick 6 python floating-point numpy python-2.7
因为numpy.arange()用于ceil((stop - start)/step)
确定项目的数量,所以小的浮点精度(stop = .400000001)
可能会向列表中添加一个意想不到的值。
第一种情况不包括停止点(拟)
>>> print(np.arange(.1,.3,.1))
[0.1 0.2]
Run Code Online (Sandbox Code Playgroud)
第二种情况包括停止点(非预期)
>>> print(np.arange(.1,.4,.1))
[0.1 0.2 0.3 0.4]
Run Code Online (Sandbox Code Playgroud)
numpy.linspace()解决了这个问题,np.linspace(.1,.4-.1,3)
。但要求您知道步骤数。np.linspace(start,stop-step,np.ceil((stop-step)/step))
导致相同的不一致。
如何在float
不知道范围内元素数量的情况下生成可靠范围?
考虑我想要生成未知精度的浮点索引的情况
np.arange(2.00(...)001,2.00(...)021,.00(...)001)
Run Code Online (Sandbox Code Playgroud)
你的目标是计算ceil((stop - start)/step)
如果这些值是用精确的数学计算出来的。
仅考虑 , 的浮点值,这是不可能做到的start
,stop
并且step
这是可能发生一些舍入错误的运算的结果。四舍五入会删除信息,并且根本无法从缺乏信息中创建信息。
因此,这个问题只是解决的,如果你有关于其他信息start
,stop
以及step
。
假设step
是准确的,但start
和stop
已经被包围了一些累积误差e0
和e1
。也就是说,您知道start
最多e0
偏离其理想的数学值(在任一方向上),stop
最多e1
偏离其理想值(在任一方向上)。那么 的理想值(stop-start)/step
可能会从(stop-start-e0-e1)/step
到(stop-start+e0+e1)/step
远离其理想值。
假设(stop-start-e0-e1)/step
to之间有一个整数(stop-start+e0+e1)/step
。然后,它是不可能知道是否理想的ceil
结果应该是刚从的浮点值较小的整数或更大start
,stop
以及step
和界限e0
和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
和step
(例如,也许他们每个人都是从十进制浮点单次转换的结果)和理想的可能值(stop-start)/step
. 如果您没有此类信息,则没有解决方案。
小智 -2
您可以使用该函数在 Python 中将数字舍入到任意精度format
。
e
例如,如果您想要小数点后的前三位数字,您可以运行
float(format(np.e, '.3f'))
Run Code Online (Sandbox Code Playgroud)
使用它可以消除浮动不精确性,您应该可以开始工作。