algorithm - clustering - guia qgis
¿Cómo calculo el poder más cercano de 2 o 10 es un número? (5)
¿Cuál es la forma más eficiente de calcular la potencia más cercana de un 2 o 10 a otro número? p.ej
3.5 devolvería 4 para potencia de 2 y 1 para potencia de 10
123 devolvería 128 para potencia de 2 y 100 para potencia de 10
0.24 devolvería 0.25 para potencia de 2 y 0.1 para potencia de 10
Solo estoy buscando el algoritmo y no me importa el lenguaje.
Creo que podría abordar el problema, pero usando log base 2 y log base 10.
log10 de (123) es 2. algo. tome la palabra de eso y luego eleve 10 a ese poder, y eso debería acercarlo.
lo mismo debería funcionar con log base 2.
log2 de (9) es 3. algo tomar el piso de eso luego elevar a ese poder
puede jugar con el redondeo del registro.
Para una potencia de 2 y> = 1, puede ver cuántas veces puede cambiar ligeramente la derecha. Por cada vez que esto es 1 potencia extra de 2, te estás quitando. Una vez que llegue a 0, tiene su número.
n^round(log_n(x))
donde log_n es el logaritmo para basar n. Puede que tenga que modificar la ronda () según cómo defina "más cercano".
Tenga en cuenta que log_n(x)
se puede implementar como:
log_n(x) = log(x) / log(n)
donde log
es un logaritmo para cualquier base conveniente.
Puede que tenga que modificar la ronda () según cómo defina "más cercano".
La respuesta de @Greg Hewgill es correcta, excepto que se redondea demasiado pronto para los ejemplos que usted dio. Por ejemplo, 10 ^ round (log_10 (3.5)) == 10, no 1. Supongo que eso es lo que quiere decir con ''cómo se define'' ''más cercano'' ''.
Probablemente la forma más sencilla de usar la fórmula de Greg y si es demasiado alta (o demasiado baja para x <1), use la siguiente potencia inferior de dos:
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
}
Para potencia de 2 en enteros, hay un truco inteligente que consiste en copiar el último bit una y otra vez a la derecha. Entonces, solo tienes que incrementar tu número y tienes tu poder de 2.
int NextPowerOf2(int n)
{
n |= (n >> 16);
n |= (n >> 8);
n |= (n >> 4);
n |= (n >> 2);
n |= (n >> 1);
++n;
return n;
}