Schnellerer ACos() mit Array und Makros

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Friedhelm:

Dir ist aber schon klar, dass beim Testen ohne Debugger alles, was hinter
einem "Debug" steht, nicht ausgeführt wird, oder?

Denn mein RT_ACos ist nicht langsamer als das normale ACos.

Hier mein Resultat mit weggekürztem Debug.
Ergebnis hat geschrieben:Es wurden je 100.000.000 Aufrufe gestartet
ACos() : 34670 ms.
RT_ACos() : 7380 ms.
RT_Fast_ACos(): 2214 ms.
Außerdem ist deine Variante leider zu ungenau für mich, was der folgende
Test beweist. Dabei wird am Ende die durchschnittliche Abweichung zu
ACos angegeben.

Code: Alles auswählen

;Schnellerer ACos() über Array und Macros gelöst
#RT_Cos2ACos = 20000 ;Genauigkeit (Speicherverbrauch: 20001 * SizeOf(Double) = 160.008 Bytes)
#RT_Cos2ACos2 = #RT_Cos2ACos / 2
Global Dim Cos2ACos.d(#RT_Cos2ACos)
For _ = 0 To #RT_Cos2ACos : Cos2ACos(_) = ACos((_ - #RT_Cos2ACos2) * 1.0 / #RT_Cos2ACos2) :Next
Macro RT_ACos(v)
  Cos2ACos(Int(v * #RT_Cos2ACos2) + #RT_Cos2ACos2)
EndMacro

Macro RT_Fast_ACos(v)
   ((((((-0.0187293  *  v)  +  0.0742610)  *  v) -  0.2121144) *  v) +  1.5707288) * Sqr(1.0-v)
EndMacro

Define a.l, r.d, f1.d, f2.d, f3.d, diff1.d, diff2.d
#count = 100000

For a = 1 To #count
  r = (Random(200000) / 100000) - 1
  Debug r
  f1 = ACos(r)
  f2 = RT_Fast_ACos(r)
  f3 = RT_ACos(r)
  diff1 + Abs(f2 - f1)
  diff2 + Abs(f3 - f1)
Next
diff1 / #count
diff2 / #count

#crlf = Chr(13) + Chr(10)
out.s = "Durchschnittliche Differenz zu ACos:" + #crlf
out   + "ACos zu RT_Fast_ACos : " + StrD(diff1) + #crlf
out   + "ACos zu RT_ACos : " + StrD(diff2) + #crlf
SetClipboardText(out)
MessageRequester("Ergebnis",out)
Antworten