Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sinus von 360° (https://www.delphipraxis.net/45513-sinus-von-360%B0.html)

zecke 7. Mai 2005 15:39


Sinus von 360°
 
:hi:

ich wollte gerade mal den Sinus von 360° von einem Dellphi-Programm ausrechnen lassen. Der ist laut Taschenrechner null, da auch der Sinus von 0° null ist, ist es nur logisch.

Als Codeschnipsel dienen folgende Zeilen:

Code:
begin
Showmessage(FloatToStr(Sin(360*2*pi/360)));
end;
oder wems besser gefällt:

Code:
begin
Showmessage(FloatToStr(Sin(360*pi/180)));
end;
das Ergebnis ist nicht null sondern nähert sich lediglich. (1,0842021724855E-19 ist zwar klein aber nicht null)

Ich stehe auf dem dicksten Schlauch den ich kenne - weiß jmd warum das so ist?

hoffe mich kann jmd vom Schlauch runterschubsen

ps: ebenso ist es bei dem Sinus von 180°, nur beim Sinus von 0° stimmt das Ergebnis (liegt nahe, dass es an der Umrechnung liegt, weil es für 0 stimmt [ 0 * irgendwas = 0 ] )

pspspspsps: für cosinus und tangens hab ich es noch gar nicht probiert

2.edit: gilt auch für cosinus und tangens-winkel bei denen das Ergebnis 0 ist. außer eben für den Winkel 0°

Insider2004 7. Mai 2005 15:54

Re: Sinus von 360°
 
Bei Floats kannst Du niemals sicher sein, dass es genau "0" ist.

Zum Formatieren probiers mal mit:

r := Sin(360*2*pi/360);
s := Format('%8.2f', [r]);

zecke 7. Mai 2005 16:00

Re: Sinus von 360°
 
danke - es stimmet und funktioniert - werde jetzt nochmal nachschauen, was du genau getan hast ^^

daumen hoch

Alexander 7. Mai 2005 16:29

Re: Sinus von 360°
 
Man sollte vielleicht noch erwähnen dass es bei Floats im Allgemeinen problematisch ist, die Werte auf genaue Zahlen auszugeben.
Ist also nicht nur bei den Trigonometrischen Funktionen so, sondern überall. Daher ist es auch immer zu empfehlen, einen Bereich um 0 abzufragen und nicht direkt 0.

Zu diesem Thema findest du hier aber noch vieles. Auch die Erklärung, warum das so ist ;)

Nikolas 7. Mai 2005 16:54

Re: Sinus von 360°
 
Für diesen lustigen Effekt haben sich die Borländer auch schon was nettes ausgedacht:

Delphi-Referenz durchsuchen iszero() Das gibt dann true zurück, wenn der übergebene Wert so wie deine ziemlich genau 0 ist.

zecke 7. Mai 2005 16:56

Re: Sinus von 360°
 
jap danke alexander und toxman :)

jetz taucht aber ein weiteres für mich bisher nicht ersichtliches problem auf. habe das ganze auf eine andere art und weise behoben, bei meiner sinus-funktion tut er alles wunderbar, doch bei cosinus und tangens hat delphi keine lsut das selbe zu tun.

hier der code für mienen knopf:

Code:
procedure TSinCosTan.Button1Click(Sender: TObject);
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
if (RadioGroup1.ItemIndex=0) then
begin
sinus:=true;
cosinus:=false;
tangens:=false;
end
else if (RadioGroup1.ItemIndex=1) then
begin
cosinus:=true;
sinus:=false;
tangens:=false;
end
else if (RadioGroup1.ItemIndex=2) then
begin
tangens:=true;
sinus:=false;
cosinus:=false;
end;

if sinus=true then
begin
Memo1.Lines.Clear;
for i:=a to b do
begin
Memo1.Lines.Add('Sinus von '+ IntToStr(i) + '°: ' + FloatToStr(Sin(i*((2*pi)/360))));
if (i=0) OR (i=180) OR (i=360) then
begin
Memo1.Lines.Add('Sinus von ' + IntTostr(i) + '°: 0');
Memo1.Lines.Delete(i);
end;
end;
end;

if cosinus=true then
begin
Memo1.Lines.Clear;
for i:=a to b do
begin
Memo1.Lines.Add('Cosinus von '+ IntToStr(i) + '°: ' + FloatToStr(Cos(i*((2*pi)/360))));
if (i=90) OR (i=270) then
begin
Memo1.Lines.Add('Cosinus von ' + IntTostr(i) + '°: 0');
Memo1.Lines.Delete(i);
end;
end;
end;

if tangens=true then
begin
Memo1.Lines.Clear;
for i:=a to b do
begin
Memo1.Lines.Add('Tangens von '+ IntToStr(i) + '°: ' + FloatToStr(Tan(i*((2*pi)/360))));
if (i=0) OR (i=180) OR (i=360) then
begin
Memo1.Lines.Delete(i);
Memo1.Lines.Add('Tangens von ' + IntTostr(i) + '°: 0');
end
else if (i=90) OR (i=270) then
begin
Memo1.Lines.Delete(i);
Memo1.Lines.Add('Tangens von ' + IntToStr(i) + '°: nicht definierbar');
end;
end;
end;
end;
alles mit standard-namen. Wie man sieht steht bei "if sinus=true" und "if cosinus=true" exakt das selbe, nur die werte sind angepasst. bei sinus funktioniert es einwandfrei doch bei cosinus nicht. das programm soll dann die eigentliche zeile (bei sinus) 0,180 und 360 löschen und eben die zeile mit ergebnis = 0 hinschreiben. beim sinus kein problem, doch beim cosinus löscht er die andere zeile nicht.

ich sehe eigentlich keinen fehler.

sieht ihn jemand von euch? :gruebel:

Nikolas 7. Mai 2005 17:19

Re: Sinus von 360°
 
Könntest du vielleicht [Delphi ]-tags benutzen und ein bischen einrücken?
Sonst ist der text doch sehr schwer zu lesen.

3_of_8 7. Mai 2005 17:23

Re: Sinus von 360°
 
Ich denke mal das liegt an der Rundungsungenauigkeit beim Umrechnen von Grad nach Bogenmaß.

zecke 7. Mai 2005 17:26

Re: Sinus von 360°
 
ja sry für meinen nudelsalat, aber ich habs behoben. ich weiß noch nicht warum, aber ich muss beim cosinus 2 mal die zeile "Memo1.Lines.Delete(i);" einfügen und beim tangens 3 mal. beim sinus eben nur ein mal. also es funktioniert. danke für die unterstützung.

Christian Seehase 7. Mai 2005 17:30

Re: Sinus von 360°
 
Moin manu,

warum löscht Du die Zeilen denn überhaupt?

Prüfe doch erst, welchen Wert i hat, und dann fügst Du die eine oder die andere Zeile hinzu (if/then/else)

zecke 7. Mai 2005 17:35

Re: Sinus von 360°
 
2.edit: :hi: ^^

ich prüfe welchen wert i hat, bei den voreingestellten werten soll er dann diese zeile löschen und durch eine andere spezeille ersetzen. ich lösche also die zeile in der er das 'falsche' ergebnis hinschreibt, dann schreibe ich die zu ersetzende hin. das war der erste weg, der mir spontan einfiel :) (ps: ich bin noch etwas noobig in delphi, weil noch nicht so viel mit gemacht)

edit1: haufenweise rechtschreibfehler ^^

Luckie 7. Mai 2005 17:37

Re: Sinus von 360°
 
Hat das eigentlich noch irgendetwas mit der ursprünglichen Frage zu tun? Wenn nein, erstelle bitte einen neuen Thread. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz