metodos guia clustering algoritmos agrupamiento algorithm math

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; }