<?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[Floats &amp;amp; Doubles..]]></title><description><![CDATA[<p>Ich zerbricht mir grad den Kopf über Floats bzw. Doubles. Ich habe damit noch nicht viel Erfahrung, da ich meistens mit ganzzahligen Werten arbeite. Ich muss in einem Programm, das ich am schreiben bin, viele Integerdivisionen durchführen, da ich Distanzen zwischen Punkten in der x,y-Ebene berechnen muss und am Schluss aufaddiere.</p>
<p>Nun folgendes Bsp:</p>
<pre><code class="language-cpp">int x1 = 3;
int y1 = 5;
float z1 = (float)x1/y1;

int x2 = 3;
int y2 = 5;
double z2 = (double)x2/y2;
</code></pre>
<p>Für z1 bekomme ich 0.60000002 und für z2 0.59999999999999998. Nun wenn ich sehr viele Divisionen ausführe und mit diesen Ungenauigkeiten weiterrechne bekomme ich am Schluss falsche Ergebnisse..<br />
Könnt ihr mir da weiterhelfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303702/floats-amp-doubles</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 07:23:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303702.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 May 2012 21:08:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Sun, 20 May 2012 21:08:16 GMT]]></title><description><![CDATA[<p>Ich zerbricht mir grad den Kopf über Floats bzw. Doubles. Ich habe damit noch nicht viel Erfahrung, da ich meistens mit ganzzahligen Werten arbeite. Ich muss in einem Programm, das ich am schreiben bin, viele Integerdivisionen durchführen, da ich Distanzen zwischen Punkten in der x,y-Ebene berechnen muss und am Schluss aufaddiere.</p>
<p>Nun folgendes Bsp:</p>
<pre><code class="language-cpp">int x1 = 3;
int y1 = 5;
float z1 = (float)x1/y1;

int x2 = 3;
int y2 = 5;
double z2 = (double)x2/y2;
</code></pre>
<p>Für z1 bekomme ich 0.60000002 und für z2 0.59999999999999998. Nun wenn ich sehr viele Divisionen ausführe und mit diesen Ungenauigkeiten weiterrechne bekomme ich am Schluss falsche Ergebnisse..<br />
Könnt ihr mir da weiterhelfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213583</guid><dc:creator><![CDATA[blues_solo]]></dc:creator><pubDate>Sun, 20 May 2012 21:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Sun, 20 May 2012 22:21:45 GMT]]></title><description><![CDATA[<p>Es gibt da kaum DIE Lösung.<br />
Eine Möglichkeit wäre, das ganze nur mit Brüchen zu berechnen (Bruchklasse schreiben). So eine Klasse kann aber auch ein Problem mit der Darstellbarkeit von Zahlen bekommen (auf overflow achten).</p>
<p>Andererseits frage ich mich allerdings, wieso du so eine hohe Präzision bei Abständen zwischen Punkten brauchst?<br />
Wenn du tatsächlich nur Brüche (=Ganzzahldivisionen) aufaddierst, sollte das Endergebnis sehr nahe am richtigen sein. Ist es das nicht, hast du wohl eher irgendwo anders einen Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213598</guid><dc:creator><![CDATA[KMT]]></dc:creator><pubDate>Sun, 20 May 2012 22:21:45 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 00:18:02 GMT]]></title><description><![CDATA[<p>Vielleicht gibt es für das Problem, was du lösen willst, bessere Algorithmen, die weniger anfällig auf Rundungsfehler reagieren. 'Ne Division ist eigentlich nichts Schlimmes im Sinne der Genauigkeit. Beim Addieren kann schon mehr schief gehen. Dort addieren sich die absoluten Fehler und es kommt ggf zur <a href="http://de.wikipedia.org/wiki/Ausl%C3%B6schung_(numerische_Mathematik)" rel="nofollow">Auslöschung</a>.</p>
<p>Wenn Du nicht um eine Summe vieler Werte rumkommst und die Genauigkeit wichtig ist, wäre vielleicht Kahan's Summationsalgorithmus etwas für dich. In C++ ließe sich das auch so ganz nett implementieren:</p>
<pre><code class="language-cpp">class accu
{
public:
  accu(double sum=0, double err=0)
  : sum(sum), err(err) {}

  accu&amp; operator+=(double x)
  {
    x -= err;
    double t = sum + x; // MIT Rundungsfehlern,
    err = (t-sum)-x; // müsste sonst eigentlich 0 sein
    sum = t;
    return *this;
  }

  operator double() const {return sum;}  

private:
  double sum, err;
};

:::

int main()
{
  accu sum = 0;
  for (int k=0; k&lt;999; ++k) {
    sum += sowieso;
  }
}
</code></pre>
<p>Man kann auch die ganze Zeit mit etwas höherer Genauigkeit rechnen, zum beispiel mit &quot;quad doubles&quot; (siehe <a href="http://crd-legacy.lbl.gov/~dhbailey/mpdist/" rel="nofollow">QD</a>), oder per MPFR-Bibliothek. Habe ich aber beides noch nicht getestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213605</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 21 May 2012 00:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 07:11:17 GMT]]></title><description><![CDATA[<p>blues_solo schrieb:</p>
<blockquote>
<p>Für z1 bekomme ich 0.60000002 und für z2 0.59999999999999998.</p>
</blockquote>
<p>Das ist jetzt kein Fehler der Division, sondern ein Problem der Darstellung der Zahl 0.6 als Fließkommazahl im Dualsystem.</p>
<p>Du kannst auch gleich</p>
<pre><code class="language-cpp">double z2 = 0.6;
</code></pre>
<p>schreiben. Kommt das Gleiche bei raus.</p>
<p>Du kannst noch long double probieren, wenn dein System das unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213625</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Mon, 21 May 2012 07:11:17 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 08:24:51 GMT]]></title><description><![CDATA[<p>Ich empfehle, das Ergebnis sinnvoll zu runden. Und untersuche, wie groß der Fehler werden kann und überlege, ob das für dich ausreichend ist. Immerhin tritt der Fehler erst bei der 17. signifikanten Stelle auf. Da musst Du schon ganz schön viel rechnen, bevor Du auf einen signifikanten Fehler kommst.</p>
<p>Aber prinzipiell ist es natürlich sehr sinnvoll, sich darüber Gedanken zu machen. Wenn das Ergebnis ist, dass der Fehler klein genug ist, dann ist man doch auf der sicheren Seite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213652</guid><dc:creator><![CDATA[ich bins]]></dc:creator><pubDate>Mon, 21 May 2012 08:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 09:28:31 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Antworten! Warum schreibt der Rechner nicht 0.6? 3/5 hat ja keinen Rest.</p>
<p>DirkB schrieb:</p>
<blockquote>
<p>Du kannst noch long double probieren, wenn dein System das unterstützt.</p>
</blockquote>
<p>Habe ich ausprobiert. Nun treten keine Fehler mehr auf, die vom gewünschten Ergebnis abweichen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213673</guid><dc:creator><![CDATA[blues_solo]]></dc:creator><pubDate>Mon, 21 May 2012 09:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 09:32:44 GMT]]></title><description><![CDATA[<p>blues_solo schrieb:</p>
<blockquote>
<p>Vielen Dank für eure Antworten! Warum schreibt der Rechner nicht 0.6? 3/5 hat ja keinen Rest.</p>
</blockquote>
<p>Klar. 3/5 ist 0 Rest 3. Und der Computer schreibt nicht 0.6, weil die Zahlen im Binärsystem verschoben werden. Warum schreibst du bei 1/3 nicht einfach 0.1 im Dreiersystem? Genau, weil du sonst das Dezimalsystem nutzt. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2213676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213676</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 21 May 2012 09:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 09:37:17 GMT]]></title><description><![CDATA[<p>Hehe stimmt. Da hast du recht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213679</guid><dc:creator><![CDATA[blues_solo]]></dc:creator><pubDate>Mon, 21 May 2012 09:37:17 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 09:39:21 GMT]]></title><description><![CDATA[<p>@blues_solo<br />
Geh hin und lern über die Gleitkommazahlen</p>
<p>blues_solo schrieb:</p>
<blockquote>
<p>DirkB schrieb:</p>
<blockquote>
<p>Du kannst noch long double probieren, wenn dein System das unterstützt.</p>
</blockquote>
<p>Habe ich ausprobiert. Nun treten keine Fehler mehr auf, die vom gewünschten Ergebnis abweichen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p><a href="http://www.threadbombing.com/data/media/2/687fea91677be9103defb8dc0b97e8b7.gif" rel="nofollow">Na dann ist ja alles gut.</a><br />
Tip: Die Abweichungen hast du immer noch, nur jetzt sind sie um ein paar Stellen weiter nach rechts gerückt, und werden bei der Ausgabe weggerundet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213680</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 21 May 2012 09:39:21 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Mon, 21 May 2012 10:44:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Beim Addieren kann schon mehr schief gehen. Dort addieren sich die absoluten Fehler und es kommt ggf zur Auslöschung.</p>
</blockquote>
<p>Auslöschung sollte eigentlich weniger ein Problem sein, da Distanzen immer &gt;= 0 sind und damit keine Subtraktion auftreten sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213707</guid><dc:creator><![CDATA[KMT]]></dc:creator><pubDate>Mon, 21 May 2012 10:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to Floats &amp;amp; Doubles.. on Tue, 22 May 2012 20:53:02 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Das werde ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ja jetzt ist die Abweichung so klein geworden, dass es beim abrunden auf ganze Zahlen keine Fehler mehr gibt.</p>
<p>Ich danke euch nochmals für eure Antworten</p>
<p>Gruss blues_solo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214284</guid><dc:creator><![CDATA[blues_solo]]></dc:creator><pubDate>Tue, 22 May 2012 20:53:02 GMT</pubDate></item></channel></rss>