如何计算最接近2或10的幂是多少?

时间:2008-11-05 01:06:04

标签: algorithm math

将2或10的最近功率与另一个数字相结合的最有效方法是什么? e.g。

对于2的幂,3.5将返回4,对于10的幂,将返回1

对于2的幂,123将返回128,对于10的幂,则返回100

对于2的幂,0.24将返回0.25,对于10的幂,0.1将返回0.1

我只是在寻找算法而不介意语言。

5 个答案:

答案 0 :(得分:31)

n^round(log_n(x))

其中log_n是基数n的对数。您可能必须修改round(),具体取决于您如何定义“最接近”。

请注意,log_n(x)可以实现为:

log_n(x) = log(x) / log(n)

其中log是任何方便基数的对数。

答案 1 :(得分:5)

对于整数2的幂,有一个聪明的技巧,包括将最后一位一遍又一遍地复制到右边。然后,你只需增加你的数字,你就有2的力量。

int NextPowerOf2(int n)
{
   n |= (n >> 16);
   n |= (n >> 8);
   n |= (n >> 4);
   n |= (n >> 2);
   n |= (n >> 1);
   ++n;
   return n;
}

答案 2 :(得分:2)

对于2的幂和> = 1,您可以看到您可以向右移位多少次。每次超过2的额外功率,你就会带走。一旦你降到0,你就得到了你的号码。

答案 3 :(得分:0)

我认为我可能会解决问题,但使用log base 2和log base 10。

<123>(123)的log10是2.something。 请发言 然后将10增加到那个力量,这应该让你接近。

同样的事情应该与log base 2一起使用。

(9)的log2是3.something 请发言 然后提高到那个力量

你可能会玩日志的四舍五入。

答案 4 :(得分:0)

  

您可能需要修改round(),具体取决于您定义“最近”的方式。

@Greg Hewgill的答案是正确的,除非它为你给出的例子太早结束。例如,10 ^ round(log_10(3.5))== 10,而不是1.我假设他的意思是“你如何定义”最接近的''。

可能是使用Greg公式的最简单方法,如果它太高(或者对于x <1来说太低),请使用下一个较低的2的幂:

closest = n ^ round(log_n(x))

if (closest > x) {
    other = closest / n
} else {
    other = closest * n
}

if (abs(other - x) < abs(closest - x)) {
    return other
} else {
    return closest
}