将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我只是在寻找算法而不介意语言。
答案 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
}