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 ...
Perché non stai operando direttamente sul 'float'? Perché pensi che qualcosa cambi se si tenta di operare sulla stessa variabile (attraverso un diverso tipo)? –
le operazioni con bit a bit sono più veloci, giusto? la ragione non ha importanza, sto solo cercando di capire come farlo. –
L'intenzione della mia domanda era di farti riflettere. Perché non direttamente 'length >> = 1'? –