消除任何十进制数的最快方法
Fastest way to ceil any decimal number
我有两个变量:
var elems;
var limit;
两者都可以是任意整数。
想象一下 elems = 5 和 limit = 3,然后 elems / limit 给了我们一组框。
如果elems是limit的倍数,那么我们只会得到"full boxes",否则,if limit < elems
我们会多得到一个"incomplete box"。 If limit > elems
,那当然只有"one full box".
例如 (5 / 3):
total elems: 5
limit: 3
offset: 0 3
box number: [0] [1]
elems contained: 3 2
offset = box number * limit
在此示例中,框偏移 3 是 "incomplete box",框偏移 0 是完整的。
我想找到最大偏移量,对于给定任意数量的元素和任意数量的限制的任何情况。这个问题最简单的形式是找到最快的方法来计算在任何地方有任何小数的任何数字,以适合的方式适合查找最大偏移量问题.
到目前为止我想出了这些解决方案:
maxOffset = ((elems / limit - 1 | 0) + Math.ceil((elems % limit) / limit)) * limit;
maxOffset = Math.abs(Math.ceil((elems / limit) - 1) * limit);
maxOffset = (elems === limit) ? 0 : (1 === limit) ? (elems - 1) : (elems / limit >> 0) * limit;
不过,我正在寻找更优雅的解决方案。我在想也许:
maxOffset = ((elems / limit) - 1E-16 | 0) * limit;
但我不确定大数字到底会发生什么(我假设它会失败?),如果 1E-16 实际上是任何浮点数可以拥有的最小十进制数。
这根本不是作业,我只是一个业余程序员,我正在尝试为我正在编写的 CMS 解决这个问题。希望我说清楚了,谢谢。
看你的例子,你想要
maxOffset = limit * Math.floor((elems - 1) / limit);
因为这是任何框的 first 元素的最大索引。对于 limit = 3
,您在 {0, 1, 2} 中的 elems
中得到 maxOffset == 0
,在 {3, 4, 5} 中的 elems
中得到 maxOffset == 1
,并且很快。如果你的整数是非负数,我可能会写成
maxOffset = limit * (((elems - 1) / limit) | 0);
要学习的教训:不是从分数中减去一些浮点偏移量,而是从分子中减去一个整数偏移量,你可以完全停留在整数运算中,JS 引擎可能可以利用它来提高性能。
我有两个变量:
var elems;
var limit;
两者都可以是任意整数。
想象一下 elems = 5 和 limit = 3,然后 elems / limit 给了我们一组框。
如果elems是limit的倍数,那么我们只会得到"full boxes",否则,if limit < elems
我们会多得到一个"incomplete box"。 If limit > elems
,那当然只有"one full box".
例如 (5 / 3):
total elems: 5
limit: 3
offset: 0 3
box number: [0] [1]
elems contained: 3 2
offset = box number * limit
在此示例中,框偏移 3 是 "incomplete box",框偏移 0 是完整的。
我想找到最大偏移量,对于给定任意数量的元素和任意数量的限制的任何情况。这个问题最简单的形式是找到最快的方法来计算在任何地方有任何小数的任何数字,以适合的方式适合查找最大偏移量问题.
到目前为止我想出了这些解决方案:
maxOffset = ((elems / limit - 1 | 0) + Math.ceil((elems % limit) / limit)) * limit;
maxOffset = Math.abs(Math.ceil((elems / limit) - 1) * limit);
maxOffset = (elems === limit) ? 0 : (1 === limit) ? (elems - 1) : (elems / limit >> 0) * limit;
不过,我正在寻找更优雅的解决方案。我在想也许:
maxOffset = ((elems / limit) - 1E-16 | 0) * limit;
但我不确定大数字到底会发生什么(我假设它会失败?),如果 1E-16 实际上是任何浮点数可以拥有的最小十进制数。
这根本不是作业,我只是一个业余程序员,我正在尝试为我正在编写的 CMS 解决这个问题。希望我说清楚了,谢谢。
看你的例子,你想要
maxOffset = limit * Math.floor((elems - 1) / limit);
因为这是任何框的 first 元素的最大索引。对于 limit = 3
,您在 {0, 1, 2} 中的 elems
中得到 maxOffset == 0
,在 {3, 4, 5} 中的 elems
中得到 maxOffset == 1
,并且很快。如果你的整数是非负数,我可能会写成
maxOffset = limit * (((elems - 1) / limit) | 0);
要学习的教训:不是从分数中减去一些浮点偏移量,而是从分子中减去一个整数偏移量,你可以完全停留在整数运算中,JS 引擎可能可以利用它来提高性能。