<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kaputter COSINUS]]></title><description><![CDATA[<p>In einer Funktion hab ich den folgenden Code:<br />
Zu einem Achsparallelem Rechteck 0,0,800,600 (Beispiel)<br />
sollen die Eckpunkte fuer eine Drehung (Beispiel 90°) berechnet werden<br />
Mittelpunkt soll die Mitte sein (Beispiel 400,300)</p>
<pre><code class="language-cpp">{
  int PicW,PicH;                                                //Bild- Breite und Hoehe
  TPoint P1,P2,P3,P4;                                           //4 x Eck- Koordinaten
  TPoint M;                                                     //Mittelpunkt
  int RotAngle;                                                 //Drehwinkel
  double ArcAng;                                                //Bogenmass zu Drehwinkrl
  double SinAngle;                                              //sin(ArcAng)
  double CosAngle;                                              //cos(ArcAng)

  RotAngle=90;
  ArcAng=RotAngle * M_PI / 180;
  SinAngle=sin(ArcAng);
  CosAngle=cos(ArcAng);                                         //cos(90°) !=0 !!!!!
//  if (abs(RotAngle-&gt;Value)&lt;=90)
//    CosAngle=sqrt(1 - SinAngle * SinAngle);
//  else
//    CosAngle=-sqrt(1 - SinAngle * SinAngle);

  PicW=800;
  PicH=600;

  M.x=PicW / 2;                                                 //=400
  M.y=PicH / 2;                                                 //=300

  P1.x=M.x - CosAngle * M.x - SinAngle * M.y;                   //=100 oder 99
  P1.y=M.y - CosAngle * M.y + SinAngle * M.x;                   //=700 oder 699
  P2.x=M.x + CosAngle * (PicW - M.x) - SinAngle * M.y;          //=100
  P2.y=M.y - CosAngle * M.y - SinAngle * (PicW - M.x);          //=-100
  P3.x=M.x - CosAngle * M.x + SinAngle * (PicH - M.y);          //=700 oder 699
  P3.y=M.y + CosAngle * (PicH - M.y) + SinAngle * M.x;          //=700
  P4.x=M.x + CosAngle * (PicW - M.x) + SinAngle * (PicH - M.y); //=700
  P4.y=M.y + CosAngle * (PicH - M.y) - SinAngle * (PicW - M.x); //=-100 oder -99

}
</code></pre>
<p>Mit den berechneten Werten wird dann ein Bild gedreht (Den Teil hab ich entfernt).<br />
Prinzipiell funktioniert allse (fast) perfekt.</p>
<p>PROBLEM:</p>
<p>Bei den Beispielwerten kommen manchmal verschiedene Ergebnisse heraus fuer P1 - P4???<br />
Der Fehler kommt aus der Cos- Funktion!<br />
cos(90°)=6.1257422745E-17</p>
<p>FRAGE:<br />
Kann mir einer erklaeren, warum das Ergebnis zufaellig richtig oder falsch 'rundet'.<br />
Beim Casten zu int sollte doch immer dasselbe Ergebnis entstehen.</p>
<p>Ich hab fuer beide Faelle mit dem Debugger die angegebenen Werte ermittelt.<br />
'Umschalten' auf die andere Variante erfolgt nach Einstellung einer anderen Farbe mit ColorDialog. Der Dialog und die Variablen haben aber NICHTS mit der Funktion zu tun???<br />
Es scheinen die Werte im RAM die Funktion zu beeinflussen.</p>
<p>PS:<br />
Die Werte fuer Breite/Hoehe und Winkel kommen von VCL- Objekten (TImage, CSpinEdit)</p>
<p>************************************<br />
Das Problem ist beseitigt, wenn ich die Zeile mit cos(...) durch die auskommentierten Zeile ersetze!<br />
Mich wuerde aber mal das Phaenomen des Zufalles interessieren.</p>
<p>Kann das am BCB 4.0 liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/100064/kaputter-cosinus</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 08:49:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/100064.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Feb 2005 12:56:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kaputter COSINUS on Thu, 03 Feb 2005 12:56:43 GMT]]></title><description><![CDATA[<p>In einer Funktion hab ich den folgenden Code:<br />
Zu einem Achsparallelem Rechteck 0,0,800,600 (Beispiel)<br />
sollen die Eckpunkte fuer eine Drehung (Beispiel 90°) berechnet werden<br />
Mittelpunkt soll die Mitte sein (Beispiel 400,300)</p>
<pre><code class="language-cpp">{
  int PicW,PicH;                                                //Bild- Breite und Hoehe
  TPoint P1,P2,P3,P4;                                           //4 x Eck- Koordinaten
  TPoint M;                                                     //Mittelpunkt
  int RotAngle;                                                 //Drehwinkel
  double ArcAng;                                                //Bogenmass zu Drehwinkrl
  double SinAngle;                                              //sin(ArcAng)
  double CosAngle;                                              //cos(ArcAng)

  RotAngle=90;
  ArcAng=RotAngle * M_PI / 180;
  SinAngle=sin(ArcAng);
  CosAngle=cos(ArcAng);                                         //cos(90°) !=0 !!!!!
//  if (abs(RotAngle-&gt;Value)&lt;=90)
//    CosAngle=sqrt(1 - SinAngle * SinAngle);
//  else
//    CosAngle=-sqrt(1 - SinAngle * SinAngle);

  PicW=800;
  PicH=600;

  M.x=PicW / 2;                                                 //=400
  M.y=PicH / 2;                                                 //=300

  P1.x=M.x - CosAngle * M.x - SinAngle * M.y;                   //=100 oder 99
  P1.y=M.y - CosAngle * M.y + SinAngle * M.x;                   //=700 oder 699
  P2.x=M.x + CosAngle * (PicW - M.x) - SinAngle * M.y;          //=100
  P2.y=M.y - CosAngle * M.y - SinAngle * (PicW - M.x);          //=-100
  P3.x=M.x - CosAngle * M.x + SinAngle * (PicH - M.y);          //=700 oder 699
  P3.y=M.y + CosAngle * (PicH - M.y) + SinAngle * M.x;          //=700
  P4.x=M.x + CosAngle * (PicW - M.x) + SinAngle * (PicH - M.y); //=700
  P4.y=M.y + CosAngle * (PicH - M.y) - SinAngle * (PicW - M.x); //=-100 oder -99

}
</code></pre>
<p>Mit den berechneten Werten wird dann ein Bild gedreht (Den Teil hab ich entfernt).<br />
Prinzipiell funktioniert allse (fast) perfekt.</p>
<p>PROBLEM:</p>
<p>Bei den Beispielwerten kommen manchmal verschiedene Ergebnisse heraus fuer P1 - P4???<br />
Der Fehler kommt aus der Cos- Funktion!<br />
cos(90°)=6.1257422745E-17</p>
<p>FRAGE:<br />
Kann mir einer erklaeren, warum das Ergebnis zufaellig richtig oder falsch 'rundet'.<br />
Beim Casten zu int sollte doch immer dasselbe Ergebnis entstehen.</p>
<p>Ich hab fuer beide Faelle mit dem Debugger die angegebenen Werte ermittelt.<br />
'Umschalten' auf die andere Variante erfolgt nach Einstellung einer anderen Farbe mit ColorDialog. Der Dialog und die Variablen haben aber NICHTS mit der Funktion zu tun???<br />
Es scheinen die Werte im RAM die Funktion zu beeinflussen.</p>
<p>PS:<br />
Die Werte fuer Breite/Hoehe und Winkel kommen von VCL- Objekten (TImage, CSpinEdit)</p>
<p>************************************<br />
Das Problem ist beseitigt, wenn ich die Zeile mit cos(...) durch die auskommentierten Zeile ersetze!<br />
Mich wuerde aber mal das Phaenomen des Zufalles interessieren.</p>
<p>Kann das am BCB 4.0 liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/713656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/713656</guid><dc:creator><![CDATA[DerAltenburger]]></dc:creator><pubDate>Thu, 03 Feb 2005 12:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Thu, 03 Feb 2005 13:24:18 GMT]]></title><description><![CDATA[<p>Prinzipiell bist du dir drüber im Klaren, dass 6.1257422745E-17 eine Zahl mit einer 0 vor dem Komma und dann erstmal ganz vielen Nullen nach dem Komma ist, oder?</p>
<p>Ich würde den Fehler daher eher auf die Ungenauigkeit von Fließkommazahlen tippen. Und wenn du nach int castest, wird immer der nächstkleinere Wert genommen. Vielleicht ist ein exaktes Runden in solch einem Fall angebrachtter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/713684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/713684</guid><dc:creator><![CDATA[Dasd]]></dc:creator><pubDate>Thu, 03 Feb 2005 13:24:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Thu, 03 Feb 2005 15:48:01 GMT]]></title><description><![CDATA[<p>Dasd schrieb:</p>
<blockquote>
<p>Prinzipiell bist du dir drüber im Klaren, dass 6.1257422745E-17 eine Zahl mit einer 0 vor dem Komma und dann erstmal ganz vielen Nullen nach dem Komma ist, oder?<br />
?</p>
</blockquote>
<p>Klar doch!!!</p>
<p>Ich würde den Fehler daher eher auf die Ungenauigkeit von Fließkommazahlen tippen. Und wenn du nach int castest, wird immer der nächstkleinere Wert genommen. Vielleicht ist ein exaktes Runden in solch einem Fall angebrachtter?[/quote]</p>
<p>Deshalb hab' ich ja die Winkelfunktionen rausgenommen.</p>
<p>Das Phaenomen ist ja, dass NICHT IMMER der nächstkleinere Wert genommen wird!!!<br />
Es kommen BEI GLEICHEN Eingangswerten z.T. verschiedene Werte raus!</p>
<p>Wenn Winkelfunktionen ungenau rechnen, sollten die das aber doch IMMER GLEICH falsch tun!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/713822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/713822</guid><dc:creator><![CDATA[DerAltenburger]]></dc:creator><pubDate>Thu, 03 Feb 2005 15:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Thu, 03 Feb 2005 21:34:57 GMT]]></title><description><![CDATA[<p>... der Compiler erwarten an solchen Stellen mitunter ein expliztest casten also</p>
<p>int x = (int)cos(alpha);</p>
<p>Das Hilft bei deinem Problem mit sicherheit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714128</guid><dc:creator><![CDATA[MasterBasti]]></dc:creator><pubDate>Thu, 03 Feb 2005 21:34:57 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 08:58:58 GMT]]></title><description><![CDATA[<blockquote>
<p>int x = (int)cos(alpha);</p>
</blockquote>
<p>Im Allgemeinen ist es eine schlechte Idee, das Ergebnis einer Winkelfunktion nach int zu casten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714292</guid><dc:creator><![CDATA[Dasd]]></dc:creator><pubDate>Fri, 04 Feb 2005 08:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 16:08:40 GMT]]></title><description><![CDATA[<p>Danke fuer Eure Tips!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber ich suche keine Loesung:</p>
<p>DerAltenburger schrieb:</p>
<blockquote>
<p>Das Problem ist beseitigt, wenn ich die Zeile mit cos(...) durch die auskommentierten Zeile ersetze!<br />
Mich wuerde aber mal das Phaenomen des Zufalles interessieren.<br />
Kann das am BCB 4.0 liegen?</p>
</blockquote>
<p>Mich stoert nur die Zufaelligkeit des Ergebnis bei der 'schlechten' Loesung mit Cos / Sin.<br />
Die Ungenauigkeit beim casten sollte doch bei gleichen Eigangsgroesen gleiche Ergebnisse (Fehler) liefern.</p>
<p>Wie macht das der Prozessor???</p>
<p>Ich moechte wissen WIE das moeglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714696</guid><dc:creator><![CDATA[DerAltenburger]]></dc:creator><pubDate>Fri, 04 Feb 2005 16:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 17:11:31 GMT]]></title><description><![CDATA[<p>Ich habe mir auch über solche Dinge den Kopf zerbrochen. Beispielsweise ist der Sinus von 45° und einem x-fachen + 45° auch verschieden. Leider wissen wir nicht wie der Sinus oder Kosinus berechnet werden (Reihenentwicklung...???). Vielleicht hilft ein Blick in ein Numerikbuch. Dort gibt es viele Abhandlungen über Rechnerungenauigkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714748</guid><dc:creator><![CDATA[marco 1977]]></dc:creator><pubDate>Fri, 04 Feb 2005 17:11:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 18:14:23 GMT]]></title><description><![CDATA[<p>Soweit mir bekannt, geht das mit Reihen:</p>
<p>X - X^3/3! + X^5/5! - X^7/7! +...</p>
<p>1 - X^2/2! + X^4/4! - X^6/6! +...</p>
<p>Deshalb auch die verschiedenen Erg. bei Vielfachen.</p>
<p>Mein Problem ist aber: Fuer ein und denselben Wert sollte IMMER dasselbe herauskommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714761</guid><dc:creator><![CDATA[DerAltenburger]]></dc:creator><pubDate>Fri, 04 Feb 2005 18:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 18:37:38 GMT]]></title><description><![CDATA[<p>Es liegt an der Anzahl der signifikanten Stellen. Der Borland Builder verwendet Intel-Float-Format. Bei Verwendung von double betragen diese 16 Stellen. Alle darauffolgende Zahlen werden ohne Sinn und Verstand angereiht. Ich hoffe diesmal mit meiner Antwort richtig zu liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714790</guid><dc:creator><![CDATA[marco 1977]]></dc:creator><pubDate>Fri, 04 Feb 2005 18:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 18:40:05 GMT]]></title><description><![CDATA[<p>Probiere mal float aus. Dann hast du sicher einen Fehler von ???*10e-7 oder e-8!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714793</guid><dc:creator><![CDATA[marco 1977]]></dc:creator><pubDate>Fri, 04 Feb 2005 18:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kaputter COSINUS on Fri, 04 Feb 2005 19:43:32 GMT]]></title><description><![CDATA[<p>marco 1977 schrieb:</p>
<blockquote>
<p>Es liegt an der Anzahl der signifikanten Stellen. Der Borland Builder verwendet Intel-Float-Format. Bei Verwendung von double betragen diese 16 Stellen. Alle darauffolgende Zahlen werden ohne Sinn und Verstand angereiht. Ich hoffe diesmal mit meiner Antwort richtig zu liegen.</p>
</blockquote>
<p>Das is ja total besch***** von Borland. Aber das erklaert das zufaellige Verhalten! Da wird alse im RAM undefiniertes Zeug mitbenutzt!? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Danke, Marco 1977 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Genau das wollte ich wissen.</p>
<p>PS: das werd' ich mal mit nem Speicherauszug analysieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714841</guid><dc:creator><![CDATA[DerAltenburger]]></dc:creator><pubDate>Fri, 04 Feb 2005 19:43:32 GMT</pubDate></item></channel></rss>