Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - arcsin im bogenmaß
johi23 - Fr 08.11.13 17:20
Titel: arcsin im bogenmaß
Hallo.
Ich muss für die schule einen Taschenrechner mit Delphi programmieren.
Ich habe schin die sin, cos und tan funktionen eingebaut. Nun möchte ich z.b. den Sin (Bogenmaß) wieder als winkel berechnen,
also einen Arcsin-Funktion.
iese funktion geht zwar im Gradmaß wenn ich sie umrechne:
sin:= arcsin (a)*180/pi;
aber nicht im Bogenmaß:
sin:= arcsin (a);
weiß jemand wo mein Fehler liegt???
johi23
johi23 - Fr 08.11.13 17:48
Der sinus (im Bogenmaß) von 55 ist -1.
Wenn ich zurückrechnen möchte und gebe arcsin (-1) ein erhelte ich anstatt 55
-1,517.
Es kommt aber keine Fehlermeldung.
jfheins - Fr 08.11.13 17:54
Das ist soweit auch völlig korrekt. Da der sinus keine monoton steigende(/fallende) Funktion ist, gibt es mehrere Eingabewerte die den gleichen Ausgabewert erzeugen. (Die Funktion ist surjektiv, aber nicht injektiv und somit nicht bijektiv)
arcsin(sin(x)) ist also in aller Regel ungleich x. Für arcsin(-1) gibt es sogar unendlich viele richtige Antworten - welche möchtest du den haben? Die Autoren der Funktion haben sich für die Betragsmäßig kleinste entschieden.
WolframAlpha kann dir das auch grafisch aufzeigen:
http://www.wolframalpha.com/input/?i=sin%28x%29+%3D+-1
johi23 - Fr 08.11.13 17:56
Ich möchte dann den 'richtige Antwort' (also 55) herausbekommen
jfheins - Fr 08.11.13 18:10
Dann darfst du nicht den Sinus benutzen, oder du merkst dir separat, auf welchen Wert du den sin angewendet hast.
So als Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| >> sin(0.8) ans = 0.7174 >> sin(2.3416) ans = 0.7174 >> sin(7.0832) ans = 0.7174 >> sin(8.6248) ans = 0.7174 |
So, da habe ich jetzt 4 Zahlen, und bei allen kommt 0.7174 als Ergebnis 'raus. Wenn ich arcsin(0.7174) rechne, warum sollte ich dann 8.6248 als Ergebnis bekommen? Warum nicht 7.0832?
johi23 - Fr 08.11.13 18:15
Mein normaler taschenrechner kann das aber auch. ibt es wirklich keinen weg um für arcsin (-1) 55 zu erhalten??
jfheins - Fr 08.11.13 18:27
Was ist das denn für ein Taschenrechner? :shock:
bei meinem gebe ich "sin⁻¹(-1)" ein, und es ergibt sich wie erwartet: -1.5707... (also -pi/2)
Alles natürlich im Bogenmaß. Im Gradmaß sollte -90 herauskommen.
Das ganze dürfte übrigens überhaupt nicht mit der Art der Berechnung zusammenhängen. Der Sinus ist nun einmal periodisch, und hat - streng genommen - für Werte oberhalb von pi/2 keine Umkehrfunktion.
Der Graph auf Wikipedia macht da ebenfalls deutlich:
http://de.wikipedia.org/wiki/Arcsin Der Y-Wert ist für alle gültigen Eingabewerte zwischen -pi/2 und pi/2
johi23 - Fr 08.11.13 18:31
okay, bekomme das gleiche raus.
Martok - Fr 08.11.13 18:43
Falls du mit "das Richtige" allerdings "etwas positives" meinst, gibt es natürlich immer noch die Möglichkeit den Winkel 360° weiter zu drehen und damit ins Intervall (0..tau] rein zu kommen.
Delphi-Quelltext
1: 2: 3:
| winkel:= arcsin(-1); if winkel < 0 then winkel:= winkel + 2*PI; |
ub60 - Fr 08.11.13 19:15
johi23 hat folgendes geschrieben : |
Mein normaler taschenrechner kann das aber auch. ibt es wirklich keinen weg um für arcsin (-1) 55 zu erhalten?? |
Also mathematisch ist es ja Quatsch, wie jfheins schon gesagt hat, aber wenn Du unbedingt die 55 erhalten willst:
Und hier das Listing:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| var Wert, SinusWert: Double; i : Integer; begin Wert:=55; SinusWert:=Sin(Wert); ListBox.Items.Add('Sin('+FloatToStrF(Wert, ffFixed, 10, 3)+')='+FloatToStrF(SinusWert, ffFixed, 10, 3)); ListBox.Items.Add('Und jetzt das Ganze rückwärts ...'); SinusWert:=-1; Wert:=ArcSin(SinusWert); ListBox.Items.Add('ArcSin('+FloatToStrF(SinusWert, ffFixed, 10, 3)+')='+FloatToStrF(Wert, ffFixed, 10, 3)); ListBox.Items.Add('Wir addieren jeweils 2*Pi, also rund 6.28 ...'); for i:=1 to 9 do begin SinusWert:=-1; SinusWert:=-0.999755173358620; Wert:=ArcSin(SinusWert)+i*2*Pi; ListBox.Items.Add('ArcSin('+FloatToStrF(SinusWert, ffFixed, 10, 3)+')='+FloatToStrF(Wert, ffFixed, 10, 3)); ListBox.Items.Add('Probe:'); SinusWert:=Sin(Wert); ListBox.Items.Add('Sin('+FloatToStrF(Wert, ffFixed, 10, 3)+')='+FloatToStrF(SinusWert, ffFixed, 10, 3)); end; end; |
ub60
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!