2008-11-05 42 views
9

¿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.¿Cómo calculo la potencia más cercana de 2 o 10 es un número?

3,5 volvería 4 de potencia de 2 y 1 para la energía de 10

123 devolvería 128 para potencia de 2 y 100 para potencia de 10

0,24 volvería 0.25 para potencia de 2 y 0,1 para el poder de 10

Estoy buscando el algoritmo y no me importa el lenguaje.

+1

Me gustaría pensar que 3.5 debería estar más cerca a 2^2 que a 2^1 – EvilTeach

+1

De manera similar, 10^0 = 1 debería estar más cerca de 3.5 que 10^1 = 10. –

+0

Gracias EvilTeach - Lo he corregido. Adam - No estoy seguro de que tu comentario sea correcto, pero gracias de todos modos –

Respuesta

30
n^round(log_n(x)) 

donde log_n es el logaritmo de la base 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 en cualquier base conveniente.

+1

En muchos idiomas populares, n^x devolverá la exclusiva a nivel de bits o de ny x. – Wedge

+4

Wedge: Sí, por supuesto. Estoy usando notación matemática (dentro de los límites de ASCII) en lugar de un lenguaje de programación específico. –

+0

El redondeo normal al entero más cercano da 10^n [o 2^n] para valores> = 10^(n-0.5) [o 2^(n-0.5)]. Supongo que eso es lo que quiere decir con "dependiendo de cómo defina más cerca" –

0

creo que podría abordar el problema, pero usando logaritmo en base 2 y log base 10.

log10 de (123) es 2.algo. tome la palabra de ese y luego eleve 10 a esa potencia, y eso debería acercarlo.

lo mismo se debe trabajar con el logaritmo en base 2.

log2 (9) es 3.Algo tomar la palabra de ese a continuación, suba a ese poder

que podría jugar con el redondeo del registro.

2

Para la potencia de 2 y> = 1, puede ver cuántas veces puede cambiar ligeramente la velocidad. 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.

5

Para potencia de 2 en enteros, hay un truco inteligente que consiste en copiar el último bit una y otra vez a la derecha. A continuación, sólo tiene que incrementar su número y tiene su 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; 
} 
+2

Tenga en cuenta que este algoritmo es para 32 bits. También aumenta los poderes de dos al siguiente valor (por ejemplo, 4 dará 8). Para cambiar la bitness, agregue o elimine términos para que el primer término sea la mitad de la cantidad de bits que tiene. Para mantener el poder de los dos como es, simplemente reste uno al principio. –

0

Es posible que tenga que modificar la ronda() dependiendo de cómo se defina "más cercano".

@Greg La respuesta de Hewgill es correcta, excepto que se redondea demasiado pronto para los ejemplos que proporcionó. 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 bajo para x < 1), utilice la siguiente potencia más baja 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 
} 
Cuestiones relacionadas