Autor Beitrag
news_001
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.05.05 09:35 
Hallo,

ein kleines mathematisches Problemchen:
ich rufe die Funktion cos() mit dem Wert 90 auf und erhalte etwa einen Wert von -0,4481. Richtig wäre aber 0. Ich glaube cos() arbeitet im Modus RAD, wie kann ich die Funktion auf DEG umstellen?
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mi 11.05.05 09:41 
Die Funktion DegToRad dürfte Dein Problem lösen.

_________________
JSXGraph
news_001 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.05.05 10:02 
Titel: Doch eher RadToDeg statt DegToRad, oder?
Vielen Dank. Leider habe ich noch einen Denkfehler, glaube ich:
Cos() gibt mir ein RAD-Wert zurück den ich nach DEG konvertiere muß, denke ich.
Aber DegToRad macht doch das genaue Gegenteil, oder?

Mit DegToRad():
ausblenden Delphi-Quelltext
1:
2:
myVari := DegToRad(cos(90)); //Ergebnis etwa = -0,0078
myVari := cos(DegToRad(90)); //Ergebnis etwa = 6,123


Mit RadToDeg():
ausblenden Delphi-Quelltext
1:
2:
myVari := RadToDeg(cos(90)); //Ergebnis etwa = -25,673
myVari := cos(RadToDeg(90)); //Ergebnis etwa = -0,2995


Leider bekomme ich nicht das richtige Ergebnis, also eine 0.

Was mache ich falsch?
Gibt es andere Funktionen zur Konvertierung?
Gibt es eine andere Cosinus-Funktion?

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: Mi 11.05.05 11:07 
Versuche doch mal folgendes:
ausblenden Delphi-Quelltext
1:
2:
  Label1.Caption := FloatToStr(RoundTo(cos(DegToRad(90)), -2));
  Label2.Caption := FloatToStr(RoundTo(cos(90 * Pi / 180), -2));


Nimm einfach zwei Label und einen Button auf dein Formular. Wenn dann immernoch nicht 0 herauskommt, dann hast du ein ernsthaftes Problem.

_________________
MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Mi 11.05.05 11:12 
ausblenden Delphi-Quelltext
1:
ShowMessage(FloatToStr(Cos(DegToRad(90))));					


wird als Ergebnis -2,71050E-20 angezeigt, also ein Zahl ganz nahe bei 0.

Gruß
KidPaddle
crakos
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 195


D2k5 Pers
BeitragVerfasst: Mi 11.05.05 13:54 
hatte das selbe prob damals bei meinem taschenrechner :/

_________________
Das Ende der Menschheit ist der Anfang der Unendlichkeit.
fantotal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
Delphi 2005
BeitragVerfasst: Mi 11.05.05 13:58 
Versuchs einfach mal so:

r := Sin(90);
s := Format('%8.2f', [r]);

Wichtig: Ungetestet :D

_________________
So long,
Sebastian
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.05.05 14:06 
@fantotal: Das Problem ist bereits gelöst und deine Antwort löst das Problem auch nicht. Das Problem ist, dass der sin 2pi-periodisch ist.
Die willkürliche Streckung auf 360° ist nur von praktischer Bedeutung und ist unmathematisch; deswegen ist vor der Berechnung des Sinus stets eine Transformation notwendig.

Der Grund, wieso man in der Praxis gerne mit 360° rechnet ist, dass diese Zahl durch viele kleine Zahlen teilen lässt (2, 3, 4, 5, 6, 8, 9, 10, 12, ...). Das hat den Vorteil, dass man beim Rechnen mit Winkeln mit ganzen Zahlen rechnen kann. Jedoch sind diese 360° völlig willkürlich und hat keinen tieferen mathematischen Hintergrund.

Also: Wenn man "mathematisch korrekt" mit Winkeln rechnen will gibt es die Zahl Pi. Es ist lediglich Sache der Gewohnheit mit Pi-Einheiten zu rechnen. Pi = 180°.
fantotal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
Delphi 2005
BeitragVerfasst: Mi 11.05.05 14:12 
@delfiphan: Naja einen Versuch war es wert :D ! Aber danke für die gute Erklärung, nun weiß ich, wenn ich sin() bzw. cos() benutze bescheid :)

_________________
So long,
Sebastian
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.05.05 14:21 
Ich muss mich noch kurz korrigieren. Der Satz "deswegen ist vor der Berechnung des Sinus stets eine Transformation notwendig." ist natürlich nicht ganz korrekt.
Es gibt Taschenrechner, wo man in den "Grad"-Modus wechseln kann, was bewirkt, dass diese erwähnte Transformation intern automatisch durchgeführt wird. Aber grundsätzlich ist der Sinus 2pi-periodisch.
news_001 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.05.05 17:00 
Mit
myVari := DegToRad(cos(90)); //Ergebnis etwa = -0,0078
komme ich zwar sehr Nahe an das richtige Ergebnis, jedoch ist dieses nicht ausreichend.

Ich benötige streng-wissenschaftlich GANZ EXAKTE Werte.
Die Konvertierung und die Rundung ist dafür nicht ausreichend.

Wer den Cosinus-Funktionsgrafen nicht im Kopf hat kann unter folgender Adresse ein kleines Schaubild finden: www.mathematik.tu-da...ktionen/trigfkt1.gif

Hier ist zu sehen das Cosinus 2pi periodisch ist und z.B. in x=1/2pi die X-Achse durchbricht. Y ist dort also ganz exakt 0!

Ich brauche eine cosinus-Funktion die mir bei Eingabe eines DEG-90° EXAKT eine 0 liefert, die nicht gerundet ist.

Gibt es sowas in delphi nicht? (Mein Taschenrechner kann das...)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.05.05 17:02 
Schau dir die Posts genauer an. Es ist nicht
DegToRad(cos(90))
sondern
cos(DegToRad(90))

Gewöhn dir die Pi-Schreibweise an. Dadurch ersparst du dir eine weitere Umrechnung, welches das Resultat verfälscht. Versuchs' mal mit cos(pi/2).

PS: "streng-wissenschaftlich GANZ EXAKTE Werte" kriegst du mit Delphi i.A. nicht (zu mindest nicht für Gleitkommazahlen).
Für symbolisches Rechnen empfehle ich dir Mathematica oder Maple.


Zuletzt bearbeitet von delfiphan am Mi 11.05.05 17:05, insgesamt 1-mal bearbeitet
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mi 11.05.05 17:04 
Da wirst du Pech haben. Auf Computern sind solche Fließkommadatentypen nur selten exakt v.a. bei solchen Operationen wie trigonometrische Funktionen und Wurzel, ln etc.

Das myVari := DegToRad(cos(90)); //Ergebnis etwa = -0,0078 ist übrigens absolut falsch. Die Konvertierung von Deg nach Rad muss vor der Berechnung des Cosinus erfolgen! Das etwas in der Nähe der Null rauskommt ist mehr oder weniger Zufall. Das ist ungefähr so, als würdest Du erst losfahren und dann erst ins Auto einsteigen...

_________________
JSXGraph
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.05.05 17:14 
Die Antwort lautet also: Nein.

Wenn es dein Taschrenrechner kann, dann rechnet dieser symbolisch (wie z.B. TI-89). Delphi kann nur numerisch rechnen.

Wofür brauchst du es überhaupt? (Symbolisches Rechnen ist wahrscheinlich hundert wenn nicht tausend mal langsamer.)
news_001 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.05.05 17:19 
Vielen dank.
Ich habe die Lösung:

Ich übergebe an cos() eine RAD via: DegToRad(90).
Cos() erwartet eine RAD und gibt auch eine RAD zurück, nähmlich ca.: 6,1230.
Diese muß mit RadToDeg() nach DEG konvertiert werden und ergibt "exakt" 0.

Im ganzen sieht das so aus:
myVari := RadToDeg(cos(DegToRad(90)));

@raziel
"Auf Computern sind solche Fließkommadatentypen nur selten exakt" Hat raziel mit dieser Aussage recht? Wer weiß mit Gewissheit das dieses Ergebnis exakt ist und nicht durch Rundungen "zufällig" entstanden ist?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.05.05 17:24 
Wie gesagt kannst du nicht exakt rechnen.
Die Maschinengenauigkeit eines Doubles ist eps = 2.2204e-016. D.h. es gilt "1+eps <> 1" für jede kleinere Zahl gilt dies nicht mehr (*). Dann wird gerundet, und zwar von der Hardware (FPU). Dagegen kannst nichts tun, ausser du rechnest symbolisch via Maple.

Edit: (*) Stimmt nicht ganz. Je nach Rundung gilt auch noch "1+0.5.0001*eps<>1". Aber es gilt mit Sicherheit "1+eps/2=1" (nach Definition).


Zuletzt bearbeitet von delfiphan am Mi 11.05.05 17:31, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 11.05.05 17:30 
Hallo, news_001!

Schau Dir hier doch mal den Abschnitt über die Zahlendarstellung im Rechner an. Dann sollte Dir klar werden, weshalb es nur eine begrenzte Genauigkeit im Rechner geben kann.

Viele Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Mi 11.05.05 17:30 
Zitat:
myVari := RadToDeg(cos(DegToRad(90)));


eher nicht, denn cos(90°) = cos(Pi/2)
es kommt eine Einheitenlose Zahl heraus. Also weder Bogen- noch Gradmass.

Daher ist die Konvertierung auch falasch. Sie verkleinert nur deinen Wert enorm.
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Mi 11.05.05 17:36 
aber es kommt keine Loesung in Rad raus. Sondern eine Absolute einheitenlose. Selbst Bogenmass ist in gewisser Form eine Einheit.

Aber sin(x) ist nunmal einheitenlos, egal ob ich Grad- oder Bogenmass reinwerfe. Daher ist dannach keine Umrechnung mehr moeglich/noetig, da mit diesem Wert eh nix mehr gemacht werden kann.
In der Praxis wird dieser Wert dann meisst wieder mit einer Laenge multipliziert um eine andere Laenge zu erhalten.
Aber wie zum Teufel will man auf eine Einheitenlose Zahl ein BogenmassNachWinkel() anwenden??


Edit:
der Post, auf den sich dieser Post bezieht wurde geloescht...
ich lass das einfach mal so stehen...
news_001 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 11.05.05 19:55 
myVari := RadToDeg(cos(DegToRad(90)));
Mein obiges Codebeispiel funktioniert nur bei 90,270,450,usw. bei allen anderen nicht.
myVari := cos(DegToRad(90));
Funktioniert bei allen außer 90,270,450,usw. .

Noch ein Anlauf:
Schreibt mir mal bitte was eure PC mit folgenden Zahlen anstellt, wenn ihr
cos(DegToRad(x));
Verwendet.

x=30
x=45
x=90
x=250
x=270
x=300

Wenn Ihr einen Taschenrechner habt würde ich mich zusätzlich auch über dessen Ausgaben freuen.

Vielen Dank im voraus.