¿Delphi te convierte en un mejor programador? ¿El código Object Pascal es más legible?
Hay un algoritmo con una constante misteriosa que saltó a la fama en el código Quake III Arena C de John Carmack para estimar rápidamente la raíz cuadrada inversa de un número de coma flotante de 32 bits.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the f**k? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; } |
Table of Contents
Entendiendo el Código
Se basa en el método de Newton para estimar raíces. Además, convierte el número de punto flotante en un entero, usa el desplazamiento de bits y comienza con una aproximación de √2 ^ 127. La línea comentada permite una iteración adicional para mejorar la estimación, que no se usó en Quate III Arena. Puede leer más sobre esto en Wikipedia o ver algunos videos de YouTube sobre el tema [incluido un análisis muy profundo ]. Aquí hay un buen video de alto nivel :
¿Puede Delphi mejorarlo?
El usuario de Facebook, Toon Krijthe, mostró cuánto más claro y simple sería el código si se implementara en Object Pascal / Delphi.
1 2 3 4 5 6 7 8 9 |
function rsqrt(const ANumber: Single): Single; var ResultAsInt: UInt32 absolute Result; begin Result := ANumber; ResultAsInt := $5F3759DF - (ResultAsInt shr 1); Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 1st iteration // Result := Result * ( 1.5 - (ANumber * 0.5 * Result * Result)); // 2nd iteration, this can be removed end; |
Hace uso de la palabra clave absoluta para asignar el número de punto flotante al entero, lo que evita todo el “hackeo maligno de nivel de bits de punto flotante”. Esto es algo que me encanta de Delphi y Object Pascal: te da acceso a punteros, memoria bruta, etc. pero no te obliga a usarlo cuando no quieres o necesitas. El código más corto no siempre es más fácil de entender, solo eche un vistazo a cualquier expresión regular, pero esto es una mejora porque elimina mucho código extraño. Mucho más legible.
Object Pascal es tan legible que mejora a los programadores ya que hace que su código sea más legible y fácil de mantener. No me malinterpretes, puedes escribir espaguetis en cualquier lenguaje / sintaxis de programación, pero comenzar con uno legible ayuda. Ésta es la razón por la que existen tantos programas Delphi “heredados”: son exitosos y se pueden mantener. El código que no funciona o que no se puede mantener se descarta o se reescribe.
¿Necesita más matemáticas de alto rendimiento?
Si está buscando rutinas matemáticas más rápidas para Delphi, consulte la biblioteca FastMath de alto rendimiento del MVP de Embarcadero Erik van Bilsen de Grijjy.
FastMath: biblioteca matemática rápida para Delphi
FastMath es una biblioteca matemática de Delphi que está optimizada para un rendimiento rápido (a veces a costa de no realizar la verificación de errores o perder un poco de precisión).
Esto hace que FastMath sea ideal para aplicaciones de alto rendimiento con uso intensivo de matemáticas, como aplicaciones y juegos multimedia. Para un rendimiento aún mejor, la biblioteca proporciona una variedad de funciones “aproximadas” (todas comienzan con un Fast
prefijo). Pueden ser muy rápidos, pero perderá algo de precisión (a veces sorprendentemente poca). Para los juegos y la animación, esta pérdida de precisión suele ser perfectamente aceptable y se ve compensada por el aumento de la velocidad. Sin embargo, no los use para cálculos científicos …
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition