Verfasst: 18.12.2006 09:51
@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.
Test beweist. Dabei wird am Ende die durchschnittliche Abweichung zu
ACos angegeben.
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)