Code-Beispiel
Streckenberechnung mit der FPU
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | ytwinky | 20.08.2010 |
Die Berechnung der Strecke(Entfernung) zwischen zwei Punkten ist relativ einfach, da
FreeBASIC eine eingebaute Wurzel-Funktion hat<Sqr(DoppeltgenaueZahl)>.
Die Streckenberechnung ist immer doppeltgenau(wg. Sqr() ), warum nicht einmal versuchen,
ob es nicht schneller zu berechnen ist..
Dafür haben wir ja die eingebaute FPU(FloatingPointUnit) und mit Asm können wir auch direkt
darauf zugreifen. Es war für mich einfacher, nach dem Assembler-Code zu googlen, als ihn
selbst zu schreiben(Fehlerwahrscheinlichkeit zu hoch..) und ich bin fündig geworden:
http://homepages.fh-giessen.de/~hg13025/vorlesung/fpu-ref.pdf
Daraus entstand das folgende (Vergleichs-)Programm:
Declare Function FStrecke(DeltaY As Double, DeltaX As Double) As Double
Declare Function Strecke(DeltaY As Double, DeltaX As Double) As Double
Dim As Double tf, tfb, ta, te, sf, sfb
Dim As Double Y1=50.0, X1=50.0, Y2=10.0, X2=10.0
Print !"Y1=50, X1=50\nY2=10, X2=10\ns(Soll)=56,568542494923801952067548968388(CalcPlus)"
ta=Timer 'Startpunkt setzen
sfb=Strecke(Y1-Y2, X2-X1) 'Strecke mit FB berechnen..
tf=Timer 'Zwischenzeit stoppen
sf=FStrecke(Y1-Y2, X2-X1) 'Strecke mit FPU berechnen..
te=Timer 'EndZeit stoppen
tfb=(tf-ta)*1000 'umrechnen in sec
tf=(te-tf)*1000 'umrechnen in sec
Print "s(FB) =" &sfb &!"\ns(FPU) =" &sf
Print "Zeit von FB:" &tfb &!"\nZeit von FPU:" &tf
Print tf-tfb &", d.h. ";
Select Case tf-tfb
Case Is<0: Print "FPU schneller als FB ;-))"
Case Is>0: Print "FPU langsamer als FB :-("
Case Else:Print "Zeit ist gleich.."
End Select
GetKey
Function Strecke(DeltaY As Double, DeltaX As Double) As Double
'die Deltas können beim Funktionsaufruf gebildet werden
Return Sqr(DeltaY^2+DeltaX^2) 'Strecke zurückgeben
End Function
Function FStrecke(DeltaY As Double, DeltaX As Double) As Double
'die Deltas können beim Funktionsaufruf gebildet werden
Asm
FLD qword ptr[DeltaY] 'lade DeltaY nach st(0)
FMUL ST(0), ST(0) 'ST(0)=DeltaY*DeltaY
FLD qword ptr[DeltaX] 'lade DeltaX nach st(0), DeltaY geht nach st(1)
FMUL ST(0), ST(0) 'ST(0)=DeltaX*DeltaX
FADDP 'ST(0)=DeltaY*DeltaY+DeltaX*DeltaX
FSQRT 'ST(0)=Sqrt(DeltaY*DeltaY+DeltaX*DeltaX)
FSTP qword ptr[Function] '...und zurückgeben
End Asm
End Function
'Keine Fehlerprüfung, da die Wahrscheinlichkeit, daß die Summe zweier Quadratzahlen
'kleiner als Null ist, ziemlich gering sein dürfte..
Fröhliches Streckenberechnen
Gruß
ytwinky
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 20.08.2010 von ytwinky angelegt.
- Die aktuellste Version wurde am 20.08.2010 von ytwinky gespeichert.
|
|