Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Mathematik

Streckenberechnung mit der FPU

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Redakteurytwinky 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:
Externer Link!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 Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 20.08.2010 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen