2011-12-16 23 views
5

Dado double x, y suponiendo que se encuentra en [0,1]. Supongamos por ejemplo que x = 0,3 en binario, (manteniendo 10 dígitos después del punto decimal), se representa comoExtraer dígitos de un carro C++

x=0.0100110011... 

quiero escribir algunos código C++ que extraer los 10 dígitos que se muestran después del punto decimal . En otras palabras, quiero extraer el número entero (0100110011) _2.

Ahora estoy bastante nuevo para desplazamiento de bits y la solución (ingenuo), que tengo para el problema es el siguiente

int temp= (int) (x*(1<<10)) 

Entonces temp en binario tendrán los 10 dígitos NECESARIO.

¿Es esta una manera segura de realizar el proceso anterior? O ¿hay formas más seguras/más correctas de hacer esto?

Nota: No quiero que los dígitos extraídos en forma de una matriz de caracteres. Específicamente quiero un número entero (O entero sin signo) para esto. La razón para hacer esto es que en la generación de octrees, los puntos en el espacio reciben claves hash basadas en su posición denominada Morton Keys. Estas claves generalmente se almacenan como enteros. Después de obtener las claves integr para todos los puntos, se ordenan. Teóricamente, estas claves se pueden obtener escalando las coordenadas a [0,1], extrayendo los bits e intercalando los mismos.

+4

10 dígitos binarios o dígitos decimales? –

+0

¿Por qué no imprimir * toda * mantisa, con tantos ceros al principio como sea necesario? –

+0

@ Oli Charlesworth: Por favor, mira editar. He aclarado mi pregunta. – smilingbuddha

Respuesta

1

Uso memcpy para copiar doble dentro de un conjunto de números de 32 bits, así:

unsigned int b[2]; // assume int is 32-bits 
memcpy(b, &x, 8); 

Los más de 10 dígitos binarios significativos están en b[0] o b[1], dependiendo de si su máquina es grande- o poco -Endian.

EDITAR: Lo mismo se puede lograr con algo de conversión en lugar de memcpy, pero eso violaría las estrictas reglas de aliasing. Una alternativa es usar un union.

+1

+1 por mencionar múltiples opciones. –

+0

El OP solicitó los 10 dígitos después del punto decimal, no los 10 dígitos más significativos. Por lo tanto, el exponente también debe tenerse en cuenta. (Pero la solución propuesta por OP es perfectamente suficiente para la tarea, sin tener que mezclar bits). – TonyK

0

leyeron: http://chrishecker.com/images/f/fb/Gdmfp.pdf

Si puede asimilar lo que el artículo que está diciendo, puede derivar el algoritmo que busca. Solo recuerda el factor de sesgo en el exponente y el líder implícito en la mantisa y el resto debería encajar en su lugar.

+0

ack, falla en la comprensión de lectura. Su solución ingenua debería funcionar igual de bien.El artículo anterior es una buena información de todos modos. – mcmcc

Cuestiones relacionadas