Seite 2 von 2

Verfasst: 18.12.2006 09:51
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)