supernicky
Goto Top

FPU Befehl für ATAN, ACOS und ASIN existiert nicht

Hallo,

Weiß jemand wie der FPU Befehl für oben genannte Funktionen lautet?

Hallo,

Ich möchte in meinem Programm die Winkel aus einem Dreieck berechnen bei dem ich nur die Längen der Seiten habe und ein Winkel immer 90 Grad ist.
Bis zum Sinus eines Winkels komme ich noch, aber es fehlen mir oben genannten Funktionen.

Die FPU hat den Befehl FPTAN und FPATAN aber damit stimmt mein Ergebnis leider nicht.

Weiß jemand welchen (Um)Weg man hier gehen muss?

Gibts bei den MMX oder SSE Befehlen etwas für oder gegen mein Problem oder setzte ich die Befehle FPTAN und FPATAN nur falsch ein?

Um Info wird gebeten..

Danke und Gruß,,

Nicky

Content-ID: 170979

Url: https://administrator.de/contentid/170979

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

64748
64748 05.08.2011 um 07:52:04 Uhr
Goto Top
Guten Morgen Nicky

Zitat von @supernicky:
... oder setzte ich die Befehle FPTAN und FPATAN nur falsch
ein?

Das ist eine gute Frage, wie setzt Du sie denn ein? vielleicht postest Du mal etwas Code.
Ansonsten eine Erklärung wie man sie richtig einsetzt hier: http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_1 ...

Gruß

Markus
supernicky
supernicky 05.08.2011 um 11:53:22 Uhr
Goto Top
Hallo Markus,

Danke für den Link.

Ich habe ein Beispiel zur Berechnung meiner Aufgabe eine gute Seite im Netz gefunden...
Code habe ich gerade keinen da, da ich an einem anderen PC sitze und erst heute abend wieder an meinem Rechner arbeite...

So solls aber gemacht werden:

Aufgabe: rechtwinkliges Dreieck mit den Seitenlängen 76mm, 34mm und 84mm.
Die Seite mit 34mm liegt dem gesuchten Winkel gegenüber. Die Seite mit 84mm ist dann die Hypothenuse.
Hilfvariablen sind p, q und h

q = 34² / 84 = 13,76190

p = 84 - q = 70,2381

h = Wurzel (q * p) = 31,09034

gesuchter Winkel im Bogenmaß = atan (h/p)

Bis zum Ergebnis von h stimmt auch alles in meinem Programm... Ich lasse mir die Ergebnisse alle anzeigen...

FPTAN scheidet aus, da er den Tanges berechnet...

FPATAN möchte zwei Parameter... nur welcher ist der zweite??? h nach Register ST(0) und p nach Register ST(1) oder ganz was anderes?

Gruß, Nicky
64748
64748 05.08.2011 um 12:20:04 Uhr
Goto Top
Hallo nochmal,

ich hab nun leider von Assembler keine Ahnung. Allerdings gibts ja die vergleichbaren trigonometrischen Funktionen in jeder Programmiersprache.

Mathematisch: der Sinus des Winkels, der der Seite mit 34mm gegenüber liegt ist gleich 34mm/84mm, also ist der gesuchte Winkel
alpha = arcsin(34mm/84mm)
Was ich nicht ganz verstehe, wenn Du schon die drei Seitenlängen des rechtwinkligen Dreiecks kennst, dann brauchst Du doch eigentlich keinen Tangens.

Oder hat einer von uns beiden die Aufgabenstellung falsch verstanden?

Gruß

Markus
dog
dog 05.08.2011 um 16:32:44 Uhr
Goto Top
FPATAN möchte zwei Parameter... nur welcher ist der zweite???

Ist doch alles dokumentiert:

The FPATAN instruction returns the angle between the X axis and the line from the origin to the point (X,Y), where Y (the ordinate) is ST(1) and X (the abscissa) is ST(0).

http://www.jaist.ac.jp/iscenter-new/mpc/altix/altixdata/opt/intel/vtune ...
supernicky
supernicky 05.08.2011 um 17:31:38 Uhr
Goto Top
Hallo Markus,

ich will auch keinen Tangens haben face-smile

das ist aber die einzigst für mich nachvollziehbare Formel die ich in meinem Programm anwenden kann.

Als FPU Befehl gibt es in Assembler nur

FCOS für den Cosinus
FSIN für den Sinus
FPTAN für den Tangens
FPATAN für den Arctangens...(denke ich jedenfalls)

Es bleibt mir also nichts anderes übrig als oben stehenden Weg zu gehen.

Auf dieser Seite wird der Rechenweg genau angegeben
http://www.arndt-bruenner.de/mathe/scripts/dreiecksberechnungrw.htm

Wie dog schon schreibt ist ja alles beschrieben...übersetzt in Google heißt das aber:
Die FPATAN Anweisung gibt den Winkel zwischen der X-Achse und die Linie vom Ursprung zum Punkt (X, Y), wobei Y (Ordinate) ist ST (1) und X (Abszisse) ist ST (0).

Leider weiß ich nicht was eine Ordinate oder eine Abszisse ist... ich bin keine Mathegenie...

Ich bräuchte nur noch den zweiten Parameter für den Befehl FPATAN. Am besten genau das Maß aus meinem Beispieldreieck, damit ich es nachvollziehen kann.

Danke und Gruß

Nicky
dog
dog 05.08.2011 um 17:40:36 Uhr
Goto Top
Sorry, was gibt es da nicht zu verstehen?

X-Achse

Im rechtwinkligen kartesischen Koordinatensystem (also das, was in 99% der Fälle benutzt wird) die Linie auf der alle Punkte (x,0) liegen.

Ursprung

Der Punkt (0,0) im Koordinatensystem.

Ordinate

Die Komponente Y des Punktes (X,Y)

Abszisse

Die Komponente X des Punktes (X,Y)

Wenn du es als Funktionen beschreiben willst bekommst du den Winkel zwischen der Funktion

f(x)=0

und

f(t)=(Y/X)*t
supernicky
supernicky 05.08.2011 um 17:49:23 Uhr
Goto Top
Hallo dog,

wie oben schon steht habe ich die richtige Formel.. Mein Dreieck hat alle Maße.

Ich finde es gut wenn du das weißt was gemeint ist, ich weiß es wirklich nicht... je mehr Formeln ich bekomme desto schwieriger wird es für mich...

Kannst du mir bitte anhand meines Dreiecks die Zahlen für den FPATAN Befehl eintragen. Also was in ST(0) und was in ST(1) stehen muss.

Danke und Gruß

Nicky
dog
dog 05.08.2011 um 20:51:18 Uhr
Goto Top
Kannst du mir bitte anhand meines Dreiecks die Zahlen für den FPATAN Befehl eintragen

Da dein Dreieck rechtwinklig ist und du schon weißt, wo er sitzt können wir 3 Vektoren konstruieren:

v1 = ( 34 0 ) v2 = ( -34 76) v3 = ( 0 -76)

Daraus ergeben sich zum Ursprung die Punkte A(0,0) B(34,0) C(0,76)

Damit können wir mit FPATAN den Winkel zwischen v1 und v3 berechnen, den kennen wir aber schon, der ist 90°

Um einen relevanten Winkel zu bekommen verschieben wir das ganze System um v1 nach links (die Vektoren verändern sich dadurch nicht!):

A(-34,0) B(0,0) C(-34,76)

Jetzt können wir FPATAN auf C anwenden und bekommen einen Winkel im 2. Quadranten (also 90° <= w <= 180°)
Um daraus den Innenwinkel zu erhalten rechen wir 180° - w
und damit lässt sich der dritte Winkel als 180° = a + 90° + (180° - w) bestimmen.
supernicky
supernicky 05.08.2011 um 23:10:06 Uhr
Goto Top
Hallo Markus,

hier der Code:

fld z2 ;34 laden
fld z2 ;34 nochmal laden
fmul ;34*34
fld z1 ;84 laden nach ST0 und 34 schieben nach ST1
fdiv ;34*34 / 84 = 13,76190

fstp q ;13,76190 nach q speichern


fld z1 ;84 laden nach ST0
fld q ;13,76190 laden nach ST0 und 84 nach ST1 schieben
fsub ;84 - 13,76190 = 70,2381

fstp p ;70,238 nach p speichern

fld p ;70,238 laden
fld q ;13,76190 laden
fmul ;13,76190 * 70,2381
fsqrt ;Wurzel ziehen
fstp h ;Ergebnis nach h speichern = 31,090347511

fld h ;31,09034 nach ST (0)
fld p ;70,2381 nach ST(0) und 31,09034 nach ST(1)
fdiv ;31,09034 / 70,2381 = 0,442642
fstp h ;0,442642 nach h speichern
bis hier passt alles:

hier der Problembereich:
fld1 ;1 auf den FPU Stack
fld h ; 0,442642 auf den FPU Stack und 1 nach ST (1)

fpatan ;hoffentlich den ATAN berechnen....

Das Ergebnis ist 11,5408. Ich muss aber irgendwie auf 24 kommen.. Die Gradzahl des Winkels..

Wenn ich vor dem FPATAN Befehl die Zahlen tauschen würde, erhalte ich als Ergebnis:
4,1672.... ist auch nicht 24.

FPATAN verlangt 2 Parameter aber ich weiß nicht wie der zweite heißt...
Ich weiß nichtmal ob FPATAN der richtige Befehl dafür ist...aber es steckt schonmal ATAN drin...


Für Infos bin ich sehr dankbar

Nicky
64748
64748 05.08.2011 um 23:43:48 Uhr
Goto Top
Guten Abend,

also mir ist das zu kompliziert.

Der Tangens (tan) des gesuchten Winkels ist doch
tan(alpha) = 34/76
damit gilt für den Winkel
alpha = atan(34/76)
und mit dem Taschenrechner (in DEG = Grad) ergeben sich 24°, also das gewünschte Ergebnis.

Nun rechnen wir hier im Bogenmaß, das bedeutet der Winkel wird gemessen als Bogenlänge auf einem Kreis mit dem Radius 1.
Der Umfang eines Kreises beträgt 360° entspricht 2*pi
da 360°/24° = 15 ist entspricht 24° im Bogenmaß genau 2*pi/15 = 2*3.14/15 = 0.419 (ungefähr laut Kopfrechnen) und das ist ja der Wert, den Du ermittelt hast.

Nochmal andersrum: multipliziere Dein Ergebnis mit 2*pi, allerdings hast Du soviele Rechnungen in Deinem Code, dass wohl von einer gewissen Ungenauigkeit auszugehen ist.

Gruß

Markus
supernicky
supernicky 06.08.2011 um 00:20:38 Uhr
Goto Top
Hallo Markus,

das ist alles richtig was du geschrieben hast.. das hab ich ja auch..

Aber Assembler hat den ATAN Befehl nicht. Ich kann den Tangens von 34/76 nicht berechnen, zumindest nicht auf dem normalen Weg.

34 / 76 = 0,447368 und der Tangens davon ist genau 0,42066. Diesen einen Schritt muss ich irgendwie ohne die Tangensfunktion berechnen.

Ich brauche also einen Befehl der mir aus der 0,447368 die 0,42066 "zaubert".

Wenn ich dort bin, weiß ich wie ich weiter rechnen muss.

Bitte grübel nochmal nach

Nicky
64748
64748 06.08.2011 um 00:31:37 Uhr
Goto Top
Zitat von @supernicky:

34 / 76 = 0,447368 und der Tangens davon ist genau 0,42066. Diesen einen Schritt muss ich irgendwie ohne die Tangensfunktion
berechnen.
Nein, das ist Unsinn, 34/76 _ist_ der Tangens des gesuchten Winkels per Definition!

Markus
dog
dog 06.08.2011 um 09:58:04 Uhr
Goto Top
Lasst euch mal nicht daran stören, dass ich oben schon eine Lösung gepostet habe...

Wenn man es sich aber kompliziert machen will:
Die arctan()-Funktion ist eine Reihe, man kann sie also auch relativ leicht selbst programmieren.
64748
64748 06.08.2011 um 10:17:45 Uhr
Goto Top
@dog: stimmt. Aber ich glaube so ganz ohne Geometriekenntnisse ist es sehr schwer überhaupt zu verstehen was man da macht. Und das wahr wohl auch das Problem.

Aber ich hätte jetzt doch gerne gewusst, wie der TO die Aufgabe gelöst hat, der Thread ist ja als gelöst markiert.

Gruß

Markus
supernicky
supernicky 07.08.2011 um 12:27:02 Uhr
Goto Top
Hallo ihr beiden...

letzte Nacht hatte ich auf einer Baustelle die Gelegenheit einen Vermessungsingenieur zu fragen wie man das berechnen kann.

Er sagte mir, das es Sinus / Cosinus sein müsste.
Auch dieser Versuch scheiterte, aber ich erinnerte mich an den FPATAN Befehl. Er benötigt ja 2 Werte.

FPATAN sin, cos ???

sin ist in meinem Fall = 34 / 84 und cos = 76 / 84

Also gleich ins Programm eingetippt und siehe da, es kommt genau der Wert raus den ich gesucht habe.
Anschließend 6,28 (2 * Pi) durch den Wert geteilt und als A gespeichert... dann 360 durch A geteilt und ich habe den genauen Winkel den ich suche.

1. FPATAN ist der richtige Befehl
2. Prarameter sind Sin und Cos (Was er damit macht weiß ich aber leider nicht)
3. Vektoren brauche ich diesmal nicht, obwohl mich der Rechenweg auch interessieren würde. Vielleicht geht der ja einfacher.

Dann bis zur nächtes Frage

Nicky
64748
64748 07.08.2011 um 12:42:39 Uhr
Goto Top
Guten Morgen,

also das steht ja alles schon weiter oben im Thread...

Ich frage mich allerdings welchen Background Du eigentlich hast. Ich meine das ist simple Geometrie, also Schulmathematik und ich kann mir beim besten Willen nicht vorstellen, dass jemand erfolgreich mit Assembler programmieren lernen/können soll wenn es an der Schulmathematik fehlt.

Das gilt im übrigen für die Programmierung mit allen anderen Sprachen auch, zumindest dann, wenn's nicht nur um Textbearbeitung geht.

Solltest Du in diesen Bereich tiefer einsteigen wollen, dann empfehle ich Dir, mal zu prüfen wie's mit den Mathekenntnissen aussieht (was hab ich in der Schule gelernt, was hab ich vergessen) und dann da mal gezielt aufzufrischen.

Nix für ungut und noch einen schönen Sonntag

Markus
supernicky
supernicky 07.08.2011 um 18:05:31 Uhr
Goto Top
Hallo Markus,

in welchem Thread steht das FPATAN der richtige Befehl ist und das sin und cos die zu übergebenden Parameter sind?

Auch auf der Seite von deinem Link steht nichts von cos und sin als Parameter.

Woher soll ich das also wissen? Auch in meinem Buch mit sehr vielen FPU Befehlen ist ausgerechnet dieser nicht beschrieben.

Nicky
64748
64748 07.08.2011 um 18:13:38 Uhr
Goto Top
Hallo nochmal,

naja, also dass der Tangens gleich dem Quotienten aus Sinus und Cosinus ist
tan(alpha) = sin(alpha) / cos(alpha)
und dass es bei den gegebenen Daten letztlich egal ist, ob du mit dem Sinus, dem Cosinus oder dem Tangens rechnest, das steht oben eigentlich alles schon.
Such mal mit google unter dem Stichwort "Trigonometrie", da findest Du dann z.B. dieses hier: http://de.wikipedia.org/wiki/Trigonometrie

Gruß

Markus