<?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[Ungenauigkeit bei Division mit Double]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>stehe gerade vor einem Problem, das mir zwar schon öfters aufgefallen ist, aber mich noch nie wirklich gestört hat:</p>
<p>Folgender simpler Code (nur als Test):</p>
<pre><code>int _tmain(int argc, _TCHAR* argv[])
{
	double dRes1;
	double dRes2;

	dRes1 = 1. / 5.;
	printf(&quot;dRes1 = %.20f\n\n&quot;, dRes1);

	for (int i = 0; i &lt;= 5; i++)
		{
		dRes2 = 62000. + dRes1 * (double)i;
		printf(&quot;i = %d, dRes2 = %.15f\n&quot;, i, dRes2);
		}

	getchar();

	return 0;
}
</code></pre>
<p>Die Ausgabe sieht folgendermaßen aus (lässt sich natürlich auch im Debugger überprüfen):</p>
<blockquote>
<p>dRes1 = 0.20000000000000001000</p>
<p>i = 0, dRes2 = 62000.000000000000000<br />
i = 1, dRes2 = 62000.199999999997000<br />
i = 2, dRes2 = 62000.400000000001000<br />
i = 3, dRes2 = 62000.599999999999000<br />
i = 4, dRes2 = 62000.800000000003000<br />
i = 5, dRes2 = 62001.000000000000000</p>
</blockquote>
<p>Wie kann man nun diese &quot;Ungenauigkeit&quot; abstellen bzw. umgehen?</p>
<p>Das ganze ist jetzt natürlich nur eine Minimalausgabe meines Problems. Im groben und ganzen muss ich dann mit den Werten, die in der Schleife berechnet werden weiterrechnen, wodurch sich dann die Ungenauigkeit natürlich immer weiter &quot;ausbreitet&quot;.</p>
<p>danke, mfg</p>
<p>mik</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209805/ungenauigkeit-bei-division-mit-double</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 23:38:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209805.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Apr 2008 14:39:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ungenauigkeit bei Division mit Double on Thu, 03 Apr 2008 14:39:36 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>stehe gerade vor einem Problem, das mir zwar schon öfters aufgefallen ist, aber mich noch nie wirklich gestört hat:</p>
<p>Folgender simpler Code (nur als Test):</p>
<pre><code>int _tmain(int argc, _TCHAR* argv[])
{
	double dRes1;
	double dRes2;

	dRes1 = 1. / 5.;
	printf(&quot;dRes1 = %.20f\n\n&quot;, dRes1);

	for (int i = 0; i &lt;= 5; i++)
		{
		dRes2 = 62000. + dRes1 * (double)i;
		printf(&quot;i = %d, dRes2 = %.15f\n&quot;, i, dRes2);
		}

	getchar();

	return 0;
}
</code></pre>
<p>Die Ausgabe sieht folgendermaßen aus (lässt sich natürlich auch im Debugger überprüfen):</p>
<blockquote>
<p>dRes1 = 0.20000000000000001000</p>
<p>i = 0, dRes2 = 62000.000000000000000<br />
i = 1, dRes2 = 62000.199999999997000<br />
i = 2, dRes2 = 62000.400000000001000<br />
i = 3, dRes2 = 62000.599999999999000<br />
i = 4, dRes2 = 62000.800000000003000<br />
i = 5, dRes2 = 62001.000000000000000</p>
</blockquote>
<p>Wie kann man nun diese &quot;Ungenauigkeit&quot; abstellen bzw. umgehen?</p>
<p>Das ganze ist jetzt natürlich nur eine Minimalausgabe meines Problems. Im groben und ganzen muss ich dann mit den Werten, die in der Schleife berechnet werden weiterrechnen, wodurch sich dann die Ungenauigkeit natürlich immer weiter &quot;ausbreitet&quot;.</p>
<p>danke, mfg</p>
<p>mik</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485880</guid><dc:creator><![CDATA[suamikim]]></dc:creator><pubDate>Thu, 03 Apr 2008 14:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to Ungenauigkeit bei Division mit Double on Thu, 03 Apr 2008 14:47:49 GMT]]></title><description><![CDATA[<p>Double sind nunmal nicht genau. Es sind Gleitkommazahl mit einer gewissen Genauigkeit und dass lässt sich auch nicht abstellen.<br />
Sonst schau dir mal Bibliotheken (wie gmp) an, die können dir fast beliebige Genauigkeit geben, aber nur mit erhötem Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485882</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Thu, 03 Apr 2008 14:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to Ungenauigkeit bei Division mit Double on Thu, 03 Apr 2008 15:04:21 GMT]]></title><description><![CDATA[<p>hmm, das hört sich nicht recht gut an <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="😉"
    /><br />
Da müsste ich dann eine Menge umstellen, wenn ich plötzlich von meinen Double-Werten auf irgendeine andere Bibliothek umsteige...</p>
<p>Dh. es gibt keinen Trick, mit dem ich zB. einfach nach der 1. Rechnung (1 / 5) einfach alles nach der zB. 4. Nachkommastelle abschneide, so dass ich als Ergebnis dann auch wirklich 0.2 habe?</p>
<blockquote>
<p>Double sind nunmal nicht genau. Es sind Gleitkommazahl mit einer gewissen Genauigkeit und dass lässt sich auch nicht abstellen.</p>
</blockquote>
<p>Kann mir vielleicht irgendwer erklären, woran das liegt, oder einen Link geben, wo das beschrieben wird? Ich verlange ja keine Undinge und Genauigkeit auf 15 Kommastellen, da verwundert es mich schon ein wenig, dass eine &quot;einfache&quot; Rechnung wie eben 1 / 5 schon zu einem solchen Fehler führt...</p>
<p>danke, mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485901</guid><dc:creator><![CDATA[suamikim]]></dc:creator><pubDate>Thu, 03 Apr 2008 15:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ungenauigkeit bei Division mit Double on Thu, 03 Apr 2008 15:07:07 GMT]]></title><description><![CDATA[<p><a href="http://de.wikipedia.org/wiki/IEEE_754" rel="nofollow">http://de.wikipedia.org/wiki/IEEE_754</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485904</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Thu, 03 Apr 2008 15:07:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ungenauigkeit bei Division mit Double on Thu, 03 Apr 2008 15:31:24 GMT]]></title><description><![CDATA[<p>suamikim schrieb:</p>
<blockquote>
<p>dass eine &quot;einfache&quot; Rechnung wie eben 1 / 5 schon zu einem solchen Fehler führt...</p>
</blockquote>
<p>1/3 ist ebenso einfach, und wir können es nicht genau darstellen. Das Problem liegt darin, dass double im Binärsystem dargestellt ist, und im binärsystem kann man nur durch potenzen von 2 gut teilen.(in trinären system ist dafür aber 1/3 sehr trivial ;))</p>
<p>Teilt man die Binäre zahl &quot;11&quot;(dez 3) durch &quot;10&quot;(also 2) kommt am Ende &quot;1.1&quot; raus, (dez 1.5).</p>
<p>0.2 lässt sich binär nicht gut darstellen. das wäre sowas wie 0.00110011... also periodisch.</p>
<p>Dazu kommen noch die &quot;normalen&quot; probleme.Irgendwann sind die grenzen der genauigkeit erreicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485915</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 03 Apr 2008 15:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to Ungenauigkeit bei Division mit Double on Thu, 03 Apr 2008 16:25:17 GMT]]></title><description><![CDATA[<p>Wenns dir nur um das Darstellen geht, kannst du doch die Streams und ihre Manipulatoren benutzen. Die können auch Nachkommestellen abschneiden. Denn letztendlich willst du anscheinend nur dem Anwender z.B. 4 Nachkommastellen zeigen?</p>
<p>Wenns auch rechnerisch genau sein soll, mußt du die Tips der Kollegen beachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485946</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 03 Apr 2008 16:25:17 GMT</pubDate></item></channel></rss>