Macht Delphi Sie zu einem besseren Programmierer? Ist Object Pascal-Code besser lesbar?
Es gibt einen Algorithmus mit einer Mystery-Konstante , der in John Carmacks Quake III Arena C-Code berühmt wurde, um die inverse Quadratwurzel einer 32-Bit-Gleitkommazahl schnell abzuschätzen.
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
Den Code verstehen
Es basiert auf Newtons Methode zur Schätzung von Wurzeln. Außerdem konvertiert es die Gleitkommazahl in eine Ganzzahl, verwendet die Bitverschiebung und beginnt mit einer Näherung von √2 ^ 127. Die auskommentierte Zeile ermöglicht eine zusätzliche Iteration zur Verbesserung der Schätzung, die in der Quate III Arena nicht verwendet wurde. Sie können mehr darüber in Wikipedia lesen oder sich einige YouTube-Videos zum Thema ansehen [einschließlich eines sehr tiefen Tauchgangs ]. Hier ist ein schönes High-Level-Video :
Kann Delphi es besser machen?
Der Facebook-Nutzer Toon Krijthe zeigte, wie viel klarer und einfacher der Code wäre, wenn er in Object Pascal / Delphi implementiert würde.
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; |
Es verwendet das absolute Schlüsselwort, um die Gleitkommazahl der Ganzzahl zuzuordnen, wodurch alle „bösen Gleitkomma-Bit-Level-Hacking“ vermieden werden . Dies ist etwas, das ich an Delphi und Object Pascal liebe: Es gibt Ihnen Zugriff auf Zeiger, Rohspeicher usw., zwingt Sie jedoch nicht dazu, es zu verwenden, wenn Sie es nicht wollen / müssen. Kürzerer Code ist nicht immer einfacher zu verstehen. Sehen Sie sich nur einen regulären Ausdruck an. Dies ist jedoch eine Verbesserung, da so viel überflüssiger Code entfernt wird. Viel besser lesbar.
Object Pascal ist so lesbar, dass Programmierer besser werden, da ihr Code besser lesbar und wartbar ist. Versteh mich nicht falsch, du kannst Spaghetti in jeder Programmiersprache / Syntax schreiben, aber es hilft, mit einer lesbaren zu beginnen. Aus diesem Grund gibt es so viele „Legacy“ -Delphi-Programme: Sie sind erfolgreich und wartbar. Code, der nicht funktioniert oder nicht gewartet werden kann, wird verworfen oder neu geschrieben.
Benötigen Sie mehr Hochleistungsmathematik?
Wenn Sie nach schnelleren mathematischen Routinen für Delphi suchen, besuchen Sie die Hochleistungs-FastMath-Bibliothek von Embarcadero MVP Erik van Bilsen von Grijjy.
FastMath – Schnelle Mathematikbibliothek für Delphi
FastMath ist eine Delphi-Mathematikbibliothek, die für eine schnelle Leistung optimiert ist (manchmal auf Kosten einer fehlenden Fehlerprüfung oder eines geringen Genauigkeitsverlusts).
Dies macht FastMath ideal für leistungsstarke mathematikintensive Anwendungen wie Multimedia-Anwendungen und Spiele. Für eine noch bessere Leistung bietet die Bibliothek eine Vielzahl von „ungefähren“ Funktionen (die alle mit einem Fast
Präfix beginnen). Diese können sehr schnell sein, aber Sie verlieren etwas (manchmal überraschend wenig) Genauigkeit. Bei Spielen und Animationen ist dieser Genauigkeitsverlust normalerweise durchaus akzeptabel und wird durch die Geschwindigkeitssteigerung aufgewogen. Verwenden Sie sie jedoch nicht für wissenschaftliche Berechnungen…
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition