| |
|
|
- Seite 1 - |
|
p.specht
| Berühmter bit-hack-Algorithmus aus QUAKE III zum Invertieren von Quadratwurzeln ... wird bei der Normierung der Länge von 3D-Vektoren in Single precision float-Variablen eingesetzt. In Assembler über drei mal schneller als 1/Sqrt() !, Fehler max. 1 %:
Youtube-Link (engl.): [...] |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 03.01.2021 ▲ |
|
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
Michael W. | Nun ja, den sollten wir eigentlich nachbilden können.
Da die (Microsoft-)Floats ja mittels Single() in einem Longint gespeichert werden können...
// Inverse Square Root
// Def !threehalfs 1.5 // oder als wirkliche Konstante, dann als Präfix
Proc Q_rsqrt Parameters number! Declare i&, x2!, y! Var threehalfs! = 1.5 // mit richtiger Konstante wird diese Zeile dann entfernt
x2! = number! * 0.5 y! = number!
i& = Single(y!) i& = $5F3759DF - (i& >> 1) y! = Double(i&)
y! = y! * (threehalfs! - (x2! * y! * y!)) // y! * (threehalfs! - (x2! * Sqr(y!))) // y! = y! * (threehalfs! - (x2! * y! * y!)) // y! * (threehalfs! - (x2! * Sqr(y!))) Return y! EndProc
Ich habe nur bis zur Formel geschaut. Einfach mal testen. |
|
|
| |
|
|
|
|
p.specht
| Mutiger Versuch, großes DANKE!
Sieht gut aus:
// Inverse Square Root
// Def !threehalfs 1.5 // oder als wirkliche Konstante, dann als Präfix
Proc Q_rsqrt
Parameters number!
Declare i&, x2!, y!
Var threehalfs! = 1.5// mit richtiger Konstante wird diese Zeile dann entfernt
x2! = number! * 0.5
y! = number!
i& = Single(y!)
i& = $5F3759DF - (i& >> 1)
y! = Double(i&)
y! = y! * (threehalfs! - (x2! * y! * y!))// y! * (threehalfs! - (x2! * Sqr(y!)))
'//y! = y! * (threehalfs! - (x2! * y! * y!)) // y! * (threehalfs! - (x2! * Sqr(y!)))
Return y!
EndProc
WindowTitle "Testbench für Michael Wodrichs Quake-Trick"
AppendMenubar 100," Testwert Quake-Output 1/Sqrt() Abs.Fehler Rel.Err %"
cls:Set("decimals",7):Print
Declare w!
WhileLoop 1,999999,50:w!=&Loop/100//generiert 5000 test steps
Print " ",w!,Q_rsqrt(w!),1/Sqrt(w!),(Q_rsqrt(w!)-1/Sqrt(w!)),(Abs(Q_rsqrt(w!)-1/Sqrt(w!))/(1/Sqrt(w!)))*100,"%"
If %csrlin>27:WaitInput 8000:cls:Print:EndIf
EndWhile
Print:Print "---":Beep
WaitInput
End
|
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 06.01.2021 ▲ |
|
|
|
|
Sven Bader | Da ich gerade mit der Generierung von Normalen arbeite, habe ich auch mal den Hack hier ausprobiert. Für das gezeigte Beispiel konnte ich keinen optischen Unterschied feststellen. Ob es in XProfan tatsächlich schneller ist habe ich noch nicht ausprobiert.
Im nächsten Schritt müsste ich übrigens noch die je 4 Normalen, die sich in den Schnittpunkten treffen zusammenfassen, dann ist die Schattierung geglättet.
|
|
|
| |
|
|
|
p.specht
| Hält sicher schön warm mit den vielen Haaren! |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 27.09.2021 ▲ |
|
|
|
|
Sven Bader |
|
|
| |
|
|