<?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[Mysteriöses Ergebnis bei einfacher Rechnung.]]></title><description><![CDATA[<p>Preisfrage wie lautet das Ergebnis? Bitte mit der Zahl 123456.78 testen.<br />
Compileroptionen(Visualstudio 2008) wie fp/precise oder strict bringen keinen Unterschied.</p>
<pre><code class="language-cpp">double d=123456.78;
int  sup=d;
d=d-sup;

printf(&quot;\n%f&quot;,d);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/289843/mysteriöses-ergebnis-bei-einfacher-rechnung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 22:49:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289843.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Jul 2011 23:28:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Wed, 13 Jul 2011 23:28:54 GMT]]></title><description><![CDATA[<p>Preisfrage wie lautet das Ergebnis? Bitte mit der Zahl 123456.78 testen.<br />
Compileroptionen(Visualstudio 2008) wie fp/precise oder strict bringen keinen Unterschied.</p>
<pre><code class="language-cpp">double d=123456.78;
int  sup=d;
d=d-sup;

printf(&quot;\n%f&quot;,d);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2092511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092511</guid><dc:creator><![CDATA[BILL]]></dc:creator><pubDate>Wed, 13 Jul 2011 23:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Wed, 13 Jul 2011 23:30:48 GMT]]></title><description><![CDATA[<p><a href="http://ideone.com/8LPKO" rel="nofollow">http://ideone.com/8LPKO</a><br />
Was ist daran myteriös?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092513</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 13 Jul 2011 23:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Wed, 13 Jul 2011 23:33:29 GMT]]></title><description><![CDATA[<p>bei mir kommt so was raus 0.7799999998.. usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092514</guid><dc:creator><![CDATA[BILL]]></dc:creator><pubDate>Wed, 13 Jul 2011 23:33:29 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Wed, 13 Jul 2011 23:45:11 GMT]]></title><description><![CDATA[<p>bin ich da einen Compilerbug aufgesessen?</p>
<pre><code class="language-cpp">double Dummi;

double Result=modf(123456.78,Dummi);

printf&quot;\n %f&quot;,Result);
</code></pre>
<p>Kann irgendwer das unter Visualstudion 2008 reproduzieren?<br />
Mit anderen Zahlen tritt das Problem nicht auf.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092516</guid><dc:creator><![CDATA[BILL]]></dc:creator><pubDate>Wed, 13 Jul 2011 23:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Wed, 13 Jul 2011 23:52:19 GMT]]></title><description><![CDATA[<p>BILL schrieb:</p>
<blockquote>
<p>Mit anderen Zahlen tritt das Problem nicht auf.</p>
</blockquote>
<p>Doch. Und das ist ganz normal. Rundungsfehler, weil double nicht alle Zahlen exakt darstellen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092519</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Jul 2011 23:52:19 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Thu, 14 Jul 2011 00:03:03 GMT]]></title><description><![CDATA[<p>Na gut, man sollte aber doch ganz naiv erwarten können,dass wenigstens &quot;modf&quot; 0.78 zurück liefert. Gibt es für das Problem irgendeine Lösung?<br />
Ich brauche nur den genauen Nachkomma-Anteil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092521</guid><dc:creator><![CDATA[BILL]]></dc:creator><pubDate>Thu, 14 Jul 2011 00:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Thu, 14 Jul 2011 00:27:28 GMT]]></title><description><![CDATA[<p>BILL schrieb:</p>
<blockquote>
<p>Na gut, man sollte aber doch ganz naiv erwarten können,dass wenigstens &quot;modf&quot; 0.78 zurück liefert. Gibt es für das Problem irgendeine Lösung?</p>
</blockquote>
<p>Nein. Keine allgemeine Lösung. Nur unendlich viele für Spezialfälle.</p>
<p>BILL schrieb:</p>
<blockquote>
<p>Ich brauche nur den genauen Nachkomma-Anteil.</p>
</blockquote>
<p>Für Geldbeträge? Rechne mit long long in Cents.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092529</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 14 Jul 2011 00:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Thu, 14 Jul 2011 00:55:50 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass 0.78 als binäre Fließkommazahl nicht genau darstellbar ist. Du läufst in das selbe Problem, das du hast, wenn du 1/3 im Dezimalsystem aufschreiben willst.</p>
<p>Ganz generell können mit einer Fließkommazahl nach ieee-754 nur rationale Zahlen genau dargestellt werden, die in gekürzter Form eine Zweierpotenz im Nenner haben. Zum Beispiel ist 0.375 = 3/8 genau darstellbar, 0.78 = 39/50 aber nicht. Ferner ist die Mantisse einer Fließkommazahl begrenzt - bei einem double hat man (von esoterischen Systemen mal abgesehen) 53 binäre Nachkommastellen, so dass die Genauigkeit eines doubles x bei etwa x * 10<sup>-16</sup> liegt.</p>
<p>Ob allerdings aus einer Rechnung mit Fließkommazahlen, selbst wenn am Ende bei symbolischer Berechnung ein solches Ergebnis herauskäme, die genaue Zahl herauskommt, ist immer noch zweifelhaft. Beispielsweise wird</p>
<pre><code class="language-cpp">for(double x = 0.0; x != 1.0; x += 0.1);
</code></pre>
<p>in der Regel eine Endlosschleife sein, da die Zwischenergebnisse nicht genau dargestellt werden können und 1.0 somit verpasst wird.</p>
<p>Es ist dementsprechend generell sinnvoll, sich bei Fließkommazahlen nicht auf ganz genaue Ergebnisse zu verlassen. Vergleiche mit == und != sollte man beispielsweise unterlassen und einen Epsilonvergleich benutzen:</p>
<pre><code class="language-cpp">bool epsilon_equal(double x, double y, double eps) {
  return std::abs(x - y) &lt; eps;
}
</code></pre>
<p>Damit ist es aber noch nicht vorbei: Beim Umgang mit Fließkommazahlen in verschiedenen Größenordnungen können diese Rundungsfehler sich leicht in relevante Größenordnungen verschieben. Nimm beispielsweise eine numerische Ableitung:</p>
<pre><code class="language-cpp">double numeric_derivate(std::tr1::function&lt;double(double)&gt; func, double x, double eps) {
  return (func(x + eps) - func(x - eps)) / (2 * eps);
}
</code></pre>
<p>Sei func = sqrt. Dann ist (ich tu jetzt mal so, als sei die interne Darstellung dezimal, um es einfacher lesbar zu machen) mit x = 3 und eps = 1e-12:</p>
<pre><code>Gewolltes Ergebnis:
 sqrt'(3) = 1 / (2 * sqrt(3))               = 0.2886751345948128

Numerische Näherung:
 sqrt(3 + eps)                              = 1.7320508075691659
                 sqrt(3 - eps)              = 1.7320508075685886
 sqrt(3 + eps) - sqrt(3 - eps)              = 0.0000000000005773 (!)
(sqrt(3 + eps) - sqrt(3 - eps)) / (2 * eps) = 0.2886500000000000
</code></pre>
<p>...was natürlich eine sehr schlechte Näherung ist. In solchen Situationen muss man sehr vorsichtig bei der Wahl seines Epsilons sein; die selbe Rechnung mit eps = 1e-5, wovon man als Mathematiker (Numeriker ausgenommen) ungenauere Ergebnisse erwarten würde, sieht beispielsweise so aus:</p>
<pre><code>sqrt(3 + eps)                              = 1.7320536943178176
                 sqrt(3 - eps)              = 1.7320479208151257
(sqrt(3 + eps) - sqrt(3 - eps))             = 0.0000057735026919
(sqrt(3 + eps) - sqrt(3 - eps)) / (2 * eps) = 0.2886751345950000
</code></pre>
<p>Die richtige Wahl des Epsilons ist natürlich nur ein Baustein in recht komplexer Materie - 10 Stellen Genauigkeit wie in diesem Beispiel mag in den meisten Fällen ausreichen, aber jetzt stell dir vor, du willst numerisch die zweite Ableitung nehmen, und auf einmal hast du ein echtes Problem.</p>
<p>Einfache Lösungen kann ich leider nicht anbieten - Numerik ist ein weitläufiges Feld, über das ganze Bibliotheken existieren. Höllische Vorsicht ist angebracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092533</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 14 Jul 2011 00:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Thu, 14 Jul 2011 06:09:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Hier nochmal was zum Lesen<br />
<a href="http://floating-point-gui.de/" rel="nofollow">http://floating-point-gui.de/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092562</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 14 Jul 2011 06:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mysteriöses Ergebnis bei einfacher Rechnung. on Thu, 14 Jul 2011 07:23:19 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Ganz generell können mit einer Fließkommazahl nach ieee-754 nur rationale Zahlen genau dargestellt werden, die in gekürzter Form eine Zweierpotenz im Nenner haben.</p>
</blockquote>
<p>Danke, der Satz ist Gold wert! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092580</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 14 Jul 2011 07:23:19 GMT</pubDate></item></channel></rss>