TinyPE的汇编源代码中包含数据对齐的“简单”普通数学公式,来自以下地址:
http://www.phreedom.org/solar/code/tinype/
这是公式:
%define round(n, r) (((n+(r-1))/r)*r)
我知道它的主要目的是在r = 8时将n = 31之类的数字与圆(n,r)== 32对齐。
我知道n表示预期的数字,r是舍入的“基数”倍数。我也知道,鉴于它是简单的汇编源代码,所有操作只返回整数,因此任何小数都会方便地丢失,因此不会导致任何计算“错误”。
问题在于以下解释是否准确,或者是否有更好,更正确的解释。我不想盲目地使用我可能会以某种方式误解的片段。
另外,我本来想使用数字+(圆形%(数字%圆)),但是当“数字”是“圆形”的精确倍数时,它会导致除零。
此公式得到一个幂的最接近的倍数,即2的幂:
在这个例子中,我们的数字是31,我们想要的数字是“基数”倍数是8.它返回32:
(((31+(8-1))/8)*8)
首先我们得到8-1,得到7.我们将它加到31,得到38。
然后我们除38/8,得到4.75。由此,整数值为4.
这4乘以8,得到32。
这些公式部分的逻辑/数学意图如下:
- 8-1部分使得存在过量,无论原始数字(在这种情况下为31)是基数舍入数的倍数(在这种情况下为8),并且给出的范围是经历了7个非多数和一个可能的倍数。 -1导致我们没有得到错误的计算,通过右转到下一个非最接近的倍数,但它只是给出了一个不准确的余量来检测其余的先前“因素”。
- 通过将这个超出的数除以基数(在这种情况下为8),在其整数部分中,我们只得到前面的因子。我们添加到它的多余部分使得数字与最接近的数字对齐,如果它在直接范围内而不提前两个倍数(因此为-1)。
- 通过将此因子的纯整数部分(在这种情况下为4)乘以基数多r(在本例中为8),我们得到精确的最接近的倍数,而不会转到下一个。例如,从31开始,最接近的8的倍数是32,而不是40。
答案 0 :(得分:1)
我不太清楚我理解你的问题,但是如果你想找到最接近给定数字x的n的幂,你可以尝试
N R个(圆(LN(X)/ LN(n))的