Autor |
Beitrag |
johi23
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 08.11.13 17:20
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
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 08.11.13 17:40
Was heißt geht nicht? Kommt eine Fehlermeldung, falsche Ergebnisse, ...?
Was für einen Wert hat denn a? Ist das im Bogenmaß?
Es gibt für die Umwandlung Bogenmaß in Grad und zurück auch fertige Funktionen (DegToRad, RadToDeg):
docwiki.embarcadero....System.Math.RadToDeg
|
|
johi23 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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: www.wolframalpha.com...?i=sin%28x%29+%3D+-1
Zuletzt bearbeitet von jfheins am Fr 08.11.13 17:59, insgesamt 1-mal bearbeitet
|
|
johi23 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 08.11.13 17:56
Ich möchte dann den 'richtige Antwort' (also 55) herausbekommen
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Fr 08.11.13 18:27
Was ist das denn für ein Taschenrechner?
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: de.wikipedia.org/wiki/Arcsin Der Y-Wert ist für alle gültigen Eingabewerte zwischen -pi/2 und pi/2
|
|
johi23 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 08.11.13 18:31
okay, bekomme das gleiche raus.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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; |
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Für diesen Beitrag haben gedankt: FinnO
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
Einloggen, um Attachments anzusehen!
|
|