你的目标是计算什么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
。如果您没有此类信息,则没有解决方案。