Autor Beitrag
johi23
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 08.11.13 17:56 
Ich möchte dann den 'richtige Antwort' (also 55) herausbekommen
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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: de.wikipedia.org/wiki/Arcsin Der Y-Wert ist für alle gültigen Eingabewerte zwischen -pi/2 und pi/2
johi23 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 08.11.13 18:31 
okay, bekomme das gleiche raus.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: Fr 08.11.13 19:15 
user profile iconjohi23 hat folgendes geschrieben Zum zitierten Posting springen:
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:
55
Und hier das Listing:
ausblenden 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, 103)+')='+FloatToStrF(SinusWert, ffFixed, 103));
  ListBox.Items.Add('Und jetzt das Ganze rückwärts ...');
  SinusWert:=-1;
  Wert:=ArcSin(SinusWert);
  ListBox.Items.Add('ArcSin('+FloatToStrF(SinusWert, ffFixed, 103)+')='+FloatToStrF(Wert, ffFixed, 103));
  ListBox.Items.Add('Wir addieren jeweils 2*Pi, also rund 6.28 ...');
  for i:=1 to 9 do
    begin
      SinusWert:=-1;
      SinusWert:=-0.999755173358620// jetzt wird es genauer
      Wert:=ArcSin(SinusWert)+i*2*Pi;
      ListBox.Items.Add('ArcSin('+FloatToStrF(SinusWert, ffFixed, 103)+')='+FloatToStrF(Wert, ffFixed, 103));
      ListBox.Items.Add('Probe:');
      SinusWert:=Sin(Wert);
      ListBox.Items.Add('Sin('+FloatToStrF(Wert, ffFixed, 103)+')='+FloatToStrF(SinusWert, ffFixed, 103));
    end;
end;


ub60
Einloggen, um Attachments anzusehen!