Encontré en la red Fast Inverse Square Root en http://en.wikipedia.org/wiki/Fast_inverse_square_root. ¿Funciona correctamente en x64? ¿Alguien lo usó y realizó una prueba seria?Fast Inverse Square Root en x64
9
A
Respuesta
17
Originalmente Fast Inverse Square Root se escribió para un flotador de 32 bits, por lo que mientras opere en representación de coma flotante IEEE-754, no hay manera de que la arquitectura x64 afecte el resultado.
Tenga en cuenta que para el punto flotante "doble" de precisión (64 bits), debe usar otra constante:
... el "número mágico" de 64 bits IEEE754 tipo de dos plazas ... se demostró ser exactamente 0x5fe6eb50c7b537a9
3
Aquí es una implementación de doble precisión flota:
#include <cstdint>
double invsqrtQuake(double number)
{
double y = number;
double x2 = y * 0.5;
std::int64_t i = *(std::int64_t *) &y;
// The magic number is for doubles is from https://cs.uwaterloo.ca/~m32rober/rsqrt.pdf
i = 0x5fe6eb50c7b537a9 - (i >> 1);
y = *(double *) &i;
y = y * (1.5 - (x2 * y * y)); // 1st iteration
// y = y * (1.5 - (x2 * y * y)); // 2nd iteration, this can be removed
return y;
}
me hicieron algunas pruebas y parece funcionar bien
Cuestiones relacionadas
- 1. Fast Average Square Difference Función
- 2. ¿Hay bibliotecas para Square Root en lugar de BigDecimal?
- 3. Infinito recursividad en el Meta Square Root Entero
- 4. Sudoku Square en una imagen
- 5. WebImage Crop To Square
- 6. Magic Square Program (C++)
- 7. Inverse String.Replace - ¿Forma más rápida de hacerlo?
- 8. UIImagePickerController - crop picture to square (en vertical)
- 9. Fast Levenshtein distancia en R?
- 10. Cuándo usar inverse = false en NHibernate/Hibernate OneToMany relationships?
- 11. Root Nodes en JSON
- 12. Delegados Fast C++
- 13. Fail Fast vs. Robustness
- 14. PHP - * fast * serialize/unserialize?
- 15. Fast Javascript Table sorter?
- 16. mongodb Fast consultas Javascript
- 17. fast numpy addnan
- 18. algoritmo sigmoide Fast
- 19. Graph API get photo square (100x100)
- 20. sizeof (int) en x64?
- 21. ¿Puedo instalar Windbg x86/x64 en mi x64 WIN7?
- 22. Depuración en XCode como root
- 23. Fast 'Buscar en archivos' para VIM?
- 24. Fast or Bulk Upsert en pymongo
- 25. Comunicación Fast IPC/Socket en Java/Python
- 26. Actualizando un Big State Fast en Haskell
- 27. Java/Android - Fast ByteBuffer Parsing
- 28. SQL Server Fast Forward Cursors
- 29. Java Fast Data Storage & Retrieval
- 30. ¿Sitecore utiliza Fast Query automáticamente?
Como nota al margen, esos trucos son desde momentos en que el punto flotante no fue compatible o lento. Aunque una raíz y división cuadradas normales todavía pueden considerarse lentas, hoy en día también tienes SSE (especialmente en x64) y su propia raíz cuadrada inversa (intrínseca: '_mm_rsqrt_ss/ps') es probablemente más rápida y más precisa que el truco de Carmack. Por supuesto, solo funciona para flotadores de 32 bits, pero de todos modos no se usan dobles para valores aproximados inexactos. –