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.
Außerdem ist deine Variante leider zu ungenau für mich, was der folgendeErgebnis hat geschrieben:Es wurden je 100.000.000 Aufrufe gestartet
ACos() : 34670 ms.
RT_ACos() : 7380 ms.
RT_Fast_ACos(): 2214 ms.
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)