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.
Wenn für zeitaufwendige oder zeitkritische Berechnungen grösseren Umfangs als Rechnungs-Genauigkeit das normale Float (single-precision, Variable.f) ausreicht, kann man mal den nachfolgenden Code ausprobieren:
;- Test, ob zwangsweises Reduzieren der FPU-Genauigkeit etwas bringt
;- "Helle" Klaus Helbing, 03.01.2007, PB v4.02
Global CWO.w
Global CWN.w
Global A.f = 12345
Global B.f = 67890
Global C.f
Procedure SetSingleFloat()
!fstcw [v_CWO] ;Control-Word sichern
!mov ax,[v_CWO]
!and ax,1111110011111111b ;die beiden Präzisions-Bit auf Null setzen = Single-Float
!mov [v_CWN],ax
!fldcw [v_CWN] ;verändertes Control-Word zurückschreiben
EndProcedure
Procedure RestoreCW()
!fldcw [v_CWO] ;ursprüngliches Control-Word zurückschreiben
EndProcedure
;-------- Test mit Original-Einstellungen
Time1 = ElapsedMilliseconds()
For i = 0 To 99999999
!Align 4 ;nur für gleiche Testbedingungen, man kann mit und ohne testen
C = A * B ;irgendeine Rechnerei
C = Sqr(C / A + B)
Next
Time = ElapsedMilliseconds() - Time1
MessageRequester("Test Original", Str(Time) + " ms " + StrF(C))
;-------- Test mit Setzen auf Single-Precision
SetSingleFloat()
Time1 = ElapsedMilliseconds()
For i = 0 To 99999999
!Align 4 ;nur für gleiche Testbedingungen, man kann mit und ohne testen
C = A * B ;irgendeine Rechnerei
C = Sqr(C / A + B) ;manche Rechenoperationen bringen viel, manche weniger, richten aber keinen Schaden an!
Next
Time = ElapsedMilliseconds() - Time1
RestoreCW() ;weil ich ordentlich bin ;-)
MessageRequester("Test Single-Precision", Str(Time) + " ms " + StrF(C))
Für die praktische Anwendung sind nur die beiden Mini-Prozeduren interessant.
Gruss
Helle
a14xerus hat geschrieben:was bezweckt eigentlich !Align 4
http://www.physik.uni-augsburg.de/~micheler/WinDLX-HTML-Help/help/.align.html hat geschrieben:Die Dateneinfügeadresse wird auf 2^Num ausgerichtet. Anders ausgedrückt wird die Dateneinfügeadresse auf die nächste Adresse gesetzt, die in ihrer Binärdarstellung die hintersten Num Bit auf 0 gesetzt hat. Zum Beispiel wird mit ".ALIGN 2" auf die nächste Wortgrenze weitergegangen.