2013-06-04 10 views
6
float length = 32.32f; 
long i = *(long*)&length ; // casting a float pointer to a long pointer... 
i >>= 1; // right shift i but 1 ... or div by 2 
length = *(float*)&i; // is this necessary? 

lunghezza stampa dà: 0.0C++ bit spostando un galleggiante

Il risultato finale dovrebbe essere: 16.16;

Questa idea è da http://en.wikipedia.org/wiki/Fast_inverse_square_root. Sto cercando di capire la sezione del codice se il lungo in un float viene estratto e vengono eseguite operazioni bit a bit su di esso. Immagino che il punto sia migliorare le prestazioni evitando la ramificazione?

Il codice sopra riportato non funziona. Qualcuno può dirmi cosa sto facendo male? Avevo l'impressione che fosse così semplice come ottenere l'archiviazione long in un float e manipolarlo, è sbagliato?

ho trovato qualcosa di interessante, se cambio il codice per:

float length = 32.32f; 
long i = *(long*)&length ; 
i = 0x5f3759df - (i >> 1); 
length = *(float*)&i; 

aggiungendo questo numero (0x5f3759df) per il mix.

Lunghezza di stampa * 100 restituisce: 17.0538 // approssimazione di 16.16
provarlo con una lunghezza diversa dà gli stessi risultati.

ad es .: lunghezza = 100; il risultato è: 10.3299 ?? // quasi ...

+0

Perché non stai operando direttamente sul 'float'? Perché pensi che qualcosa cambi se si tenta di operare sulla stessa variabile (attraverso un diverso tipo)? –

+1

le operazioni con bit a bit sono più veloci, giusto? la ragione non ha importanza, sto solo cercando di capire come farlo. –

+0

L'intenzione della mia domanda era di farti riflettere. Perché non direttamente 'length >> = 1'? –

risposta

13

Il valore binario di 32.32f è 01000010000000010100011110101110.

Dopo spostamento: 00100001000000001010001111010111

si può vedere come numeri float vengono memorizzati da Wikipedia.

segno: 0

exp: 01000010 = 66

mantissa: 00000001010001111010111 = 2 -7 (intorno)

Così il risultato = 2 (66-127) * (1 + 2 -7) = 2 -59 (circa)

non è zero. Se usi printf("%.40f\n",x2); allora lo vedrai.

Se ti senti strano sul motivo per cui quei numeri magici funzionano: puoi leggere attentamente la pagina wiki o leggere questo paper.