![]() |
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:
oder wems besser gefällt:
begin
Showmessage(FloatToStr(Sin(360*2*pi/360))); end;
Code:
das Ergebnis ist nicht null sondern nähert sich lediglich. (1,0842021724855E-19 ist zwar klein aber nicht null)
begin
Showmessage(FloatToStr(Sin(360*pi/180))); end; 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° |
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]); |
Re: Sinus von 360°
danke - es stimmet und funktioniert - werde jetzt nochmal nachschauen, was du genau getan hast ^^
daumen hoch |
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 ;) |
Re: Sinus von 360°
Für diesen lustigen Effekt haben sich die Borländer auch schon was nettes ausgedacht:
![]() |
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:
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.
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; ich sehe eigentlich keinen fehler. sieht ihn jemand von euch? :gruebel: |
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. |
Re: Sinus von 360°
Ich denke mal das liegt an der Rundungsungenauigkeit beim Umrechnen von Grad nach Bogenmaß.
|
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.
|
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) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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