6 votos

La función del suelo a la base 2

Yo no soy de las matemáticas chico, así que estoy un poco confundido acerca de esto. Tengo un programa que necesita para calcular la base en el suelo $2$ número de un flotador.

Vamos a decir un número $4$, que la base de $2$ piso sería $4$. Otros ejemplos :

  • $5 \to 4$
  • $6 \to 4$
  • $8 \to 8$
  • $12 \to 8$
  • $16 \to 16$
  • $0.5 \to 0.5$
  • $0.6 \to 0.5$
  • $0.13 \to 0.125$

¿Cómo puedo hacer esto y cuál es el nombre de este problema?

2voto

mrseaman Puntos 161

He aquí una descripción de un imperativo algoritmo para hacer el trabajo. Estoy siendo traviesos sobre análisis numérico y sólo prueba los números reales para la igualdad. Voy a dejar que te preocupes por eso.

Deje $x$ ser la entrada y poner $r = 1$. Ahora hay tres casos:

  1. Si $x < 1$, luego se divide $r$ $2$ hasta $r \le x$, $r$ ahora es el resultado;
  2. Si $x = 1$ $r$ es ya el resultado;
  3. Si $x > 1$ después multiplica $r$$2$, mientras que $2r \le x$, $r$ ahora es el resultado.

(Yo no creo que esta función tiene un nombre estándar. Como SMF dice que la fórmula es $2^{\lfloor \log_2 x \rfloor}$, lo cual es suficientemente corto como para no necesitar un nombre.)

0voto

Tanner Swett Puntos 1737

Si desea redondear un único punto flotante de precisión de valor hacia abajo a la siguiente potencia de 2, usted puede hacer esto (siempre y cuando el número es "normalizado", que siempre es menos que sea infinito, NaN, o extremadamente pequeñas) por lo que todos los bits de mantisa cero. Algo como esto probablemente funcionaría:

float truncateSgand(float value) {
    return (float) ((uint32_t) value & 0xFF800000);
}

(Usted podría tener que preocuparse de peso.)

Para un punto flotante de doble precisión, el código equivalente sería este. (Nunca he visto una de 16 dígitos hexadecimales literal C; no sé si en realidad son válidas.)

double truncateSgand(double value) {
    return (double) ((uint64_t) value & 0xFFF0000000000000;
}

Yo no he probado a cualquiera de estas funciones.

-1voto

Thomas Eding Puntos 8651

Consejos prácticos
Piso de base dos es nada, pero el piso de un número binario. Piso de base 10 da piso de decimales .
vamos a ver algunos ejemplos $$ floor_{10} 15.3=15$$ En binario- $ floor_2 110$(equivalente decimal 6)$=100$ (equivalente decimal 4) por lo que para hacer esta función convertirla primero en binario, a continuación, tomar sólo la más a la izquierda de 1 y poner el resto como 0

Para valores como 0.625 puede ser desglosado en forma binaria, que es 0.101, a continuación, $floor_2 0.101 = 0.1$ en la conversión de binario a decimal obtenemos 0.5

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X