<?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[Widersprüchliche Rechenergebnisse]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich bin C++-Anfänger und nehme gerade das Buch &quot;Der C++-Programmierer&quot; durch. Ich bin grad bei der Darstellung reeller Zahlen. In einem Beispiel (das ich hier leicht abgeändert habe) soll aufgezeigt werden, dass C++ beim Rechnen mit reellen Zahlen in bestimmten Fällen ungenaue Ergebnisse liefert. Für mich sind die Ergebnisse aber nicht nur ungenau, sondern machen überhaupt keinen Sinn..</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

int main() {

float a = 1.234567E-7;
float b = 1.000000;
float c = -b;
float s1 = a+b;
cout &lt;&lt; s1 &lt;&lt; endl;   // Konsolenausgabe: 1
s1 += c;
cout &lt;&lt; s1 &lt;&lt; endl;    // Konsolenausgabe: 1.19209e-07
cout &lt;&lt; a+b+c &lt;&lt; endl; // Konsolenausgabe: 1.23457e-07

return 0;
}
</code></pre>
<p>Im obigen Code, wird erst s1 = a+b ausgegeben. Der ausgegebene Wert ist 1, was ich soweit auch verstehe. a ist viel kleiner als b und wird deshalb bei der Addition ignoriert.<br />
Im nächsten Schritt wird nun zu s1 der nächste Summand c = -b = -1 addiert. Was ich nun erwarten würde, ist dass die Summe s1 = 0 ist, da sie ja vorher 1 war und 1 + c ja 0 ergibt. Stattdessen wird aber der Wert 1.19209e-07 augegeben. Bahnhof ftw.<br />
Im nächsten Schritt wird dann die Summe a+b+c in einem Rutsch berechnet und ausgegeben. Da dachte ich mir, C++ wäre wenigstens konsequent, und würde wieder<br />
1.19209e-07 ausgeben. Aber nein, diesmal erscheint der Wert 1.23457e-07..</p>
<p>Kann mir jemand erklären, wie diese einzelnen Ergebnisse zustande kommen? Besonders die 1.19209e-07 kann ich überhaupt nicht nachvollziehen, mir fällt keine Rechnung ein, durch die man mit den gegebenen Werten a, b, und c auf diese Zahl kommt.</p>
<p>Danke schonmal im Voraus für Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310798/widersprüchliche-rechenergebnisse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 05:35:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310798.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Nov 2012 08:54:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:02:53 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich bin C++-Anfänger und nehme gerade das Buch &quot;Der C++-Programmierer&quot; durch. Ich bin grad bei der Darstellung reeller Zahlen. In einem Beispiel (das ich hier leicht abgeändert habe) soll aufgezeigt werden, dass C++ beim Rechnen mit reellen Zahlen in bestimmten Fällen ungenaue Ergebnisse liefert. Für mich sind die Ergebnisse aber nicht nur ungenau, sondern machen überhaupt keinen Sinn..</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

int main() {

float a = 1.234567E-7;
float b = 1.000000;
float c = -b;
float s1 = a+b;
cout &lt;&lt; s1 &lt;&lt; endl;   // Konsolenausgabe: 1
s1 += c;
cout &lt;&lt; s1 &lt;&lt; endl;    // Konsolenausgabe: 1.19209e-07
cout &lt;&lt; a+b+c &lt;&lt; endl; // Konsolenausgabe: 1.23457e-07

return 0;
}
</code></pre>
<p>Im obigen Code, wird erst s1 = a+b ausgegeben. Der ausgegebene Wert ist 1, was ich soweit auch verstehe. a ist viel kleiner als b und wird deshalb bei der Addition ignoriert.<br />
Im nächsten Schritt wird nun zu s1 der nächste Summand c = -b = -1 addiert. Was ich nun erwarten würde, ist dass die Summe s1 = 0 ist, da sie ja vorher 1 war und 1 + c ja 0 ergibt. Stattdessen wird aber der Wert 1.19209e-07 augegeben. Bahnhof ftw.<br />
Im nächsten Schritt wird dann die Summe a+b+c in einem Rutsch berechnet und ausgegeben. Da dachte ich mir, C++ wäre wenigstens konsequent, und würde wieder<br />
1.19209e-07 ausgeben. Aber nein, diesmal erscheint der Wert 1.23457e-07..</p>
<p>Kann mir jemand erklären, wie diese einzelnen Ergebnisse zustande kommen? Besonders die 1.19209e-07 kann ich überhaupt nicht nachvollziehen, mir fällt keine Rechnung ein, durch die man mit den gegebenen Werten a, b, und c auf diese Zahl kommt.</p>
<p>Danke schonmal im Voraus für Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272607</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:13:00 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Kann mir jemand erklären, wie diese einzelnen Ergebnisse zustande kommen? Besonders die 1.19209e-07 kann ich überhaupt nicht nachvollziehen, mir fällt keine Rechnung ein, durch die man mit den gegebenen Werten a, b, und c auf diese Zahl kommt.</p>
</blockquote>
<p>Das ist genau das, was mit &quot;ungenauen Ergebnissen&quot; gemeint ist. Reelle Zahlen lassen sich binär nicht beliebig genau darstellen, weil du (annähernd) unendlich viele Nachkommastellen haben kannst (double d = 1.0 / 3.0).</p>
<p>Erstmal ganz dumm gefragt: Weißt du, was &quot;1.19209e-07&quot; bedeutet? Diesen Wert kannst du auch nur dann rechnerisch nachvollziehen, wenn du die exakte binäre Darstellung der beteiligten Werten kennst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272616</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:13:00 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:19:12 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<pre><code>#include&lt;iostream&gt;
#include&lt;iomanip&gt;

int main() {

float a = 1.234567e-7; 
float b = 1.000000; 
float c = -b; 
float s1 = a+b; 
std::cout &lt;&lt; std::fixed &lt;&lt; std::setprecision(10) &lt;&lt; s1 &lt;&lt; std::endl;
s1 += c;
std::cout &lt;&lt; s1 &lt;&lt; std::endl;
std::cout &lt;&lt; a+b+c &lt;&lt; std::endl;

return 0;
}
</code></pre>
</blockquote>
<p>Wenn du das meintest.<br />
Die Rechnung ist doch eigentlich richtig?<br />
Per Hand:<br />
a = 1.234567e-7 = 0.0000001234567<br />
b = 1<br />
x = -1<br />
s1 = 1.0000001234567<br />
s1 += c; s1 = 0.0000001234567<br />
a+b+c = 0.0000001234567</p>
<p>Es entstehen bloß bei den Rechnungen verschiedene ungenaue Lösungen</p>
<p>EDIT: Bin selber noch Anfänger, versuche nur zu helfen <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/2272617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272617</guid><dc:creator><![CDATA[xStrykex]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:19:12 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:31:18 GMT]]></title><description><![CDATA[<p>Hallo, danke für die Antworten</p>
<p>@daddyfelix<br />
Also 1.19209e-07 ist in der &quot;recheninternen Repräsentation&quot; einmal die Mantisse 1.19209 sowie der Exponent e-07, sowie die jeweiligen Vorzeichen bits der beiden.<br />
für die binäre Darstellung aller Werte müsst ich mich erst mal ne Weile hinhocken.<br />
Was ich aber so oder so nicht verstehe, ist dass wenn ich die Rechnung a+b+c in die zwei Rechnungen s1 = a+b und s1+=c splitte unterschiedliche Werte herauskommen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29646">@xStrykex</a><br />
Stimmt, die 1.234567e-7 kann ich nachvollziehen. Aber wie kommt dann das Programm auf die 1.19209e-07?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272625</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:42:22 GMT]]></title><description><![CDATA[<p>Die großen Fehler kommen hier übrigens aus zwei Rechnungen:<br />
1. a + b: Etwas sehr kleines + etwas sehr großes, da geht die Genauigkeit des kleinen verloren, da der Großteil der Darstellung bereits für die große Zahl draufgeht. (Stichwort: <a href="http://de.wikipedia.org/wiki/Gleitkommazahl#Zahlen_verschiedener_Gr.C3.B6.C3.9Fenordnung_.28engl._absorption.29" rel="nofollow">absorption</a>)<br />
2. s1 - c: Zwei Zahlen fast gleicher Größe werden subtrahiert, dadurch bekommt man einen gigantischen relativen Fehler. (Stichwort: <a href="http://de.wikipedia.org/wiki/Gleitkommazahl#Ausl.C3.B6schung" rel="nofollow">cancellation</a>)</p>
<p>Da das die beiden grundlegenden Fehler der Numerik sind (und auch die beiden ersten, die auf Wikipedia aufgelistet werden), gehe ich mal davon aus, dass dieser Rechenweg mit Absicht so gewählt worden ist, um als abschreckendes Beispiel zu dienen.</p>
<p>edit: Der Threadersteller hat noch etwas gefragt, während ich schrieb:</p>
<blockquote>
<p>Stimmt, die 1.234567e-7 kann ich nachvollziehen. Aber wie kommt dann das Programm auf die 1.19209e-07?</p>
</blockquote>
<p>Ist hoffentlich nun klar, siehe oben</p>
<blockquote>
<p>Was ich aber so oder so nicht verstehe, ist dass wenn ich die Rechnung a+b+c in die zwei Rechnungen s1 = a+b und s1+=c splitte unterschiedliche Werte herauskommen.</p>
</blockquote>
<p>Spekulation ohne jetzt genau darüber nachzudenken: Diese Rechnung darf komplett im Rechenwerk durchgeführt werden, ohne zwischendurch in eine Variable begrenzter Genauigkeit zurück geschrieben zu werden. Das Rechenwerk ist wesentlich genauer (in der Regel 80 Bit), da reicht die hier nötige Genauigkeit für die Zwischenschritte locker aus. Wie genau Rechnungen mit Fließkommazahlen durchgeführt werden ist im C++-Standard (bewusst) nur sehr vage beschrieben. Auf den allermeisten Systemen wird jedoch nach IEEE 754 gerechnet, außerdem kannst du auf einem x86(-64) davon ausgehen, dass entweder der x87-Coprozessor oder die SSE-Einheit zum Rechnen benutzt wird (je nach Optimierungseinstellungen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272627</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:37:31 GMT]]></title><description><![CDATA[<p>Ich würde einen Erfahrenen mal bitten, sich das hier kurz anzugucken. Dadurch bin ich damals auf die Lösung des Problems, bzw eher gesagt, warum das so ist, gekommen.</p>
<p><a href="http://www.tutorials.de/c-c/381980-problem-gleitkommatypen-assoziativgesetz.html#post1975101" rel="nofollow">http://www.tutorials.de/c-c/381980-problem-gleitkommatypen-assoziativgesetz.html#post1975101</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272628</guid><dc:creator><![CDATA[xStrykex]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:39:59 GMT]]></title><description><![CDATA[<p>Ist jetzt nur eine Vermutung, aber evtl. wird die Addition im letzten Fall einfach wegoptimiert, da sinnlos. Also hast du da evtl. einfach nur</p>
<pre><code>std::cout &lt;&lt; a &lt;&lt; std::endl;
</code></pre>
<p>stehen.</p>
<p>Im vorherigen Fall müssen die Additionen aber tatsächlich durchgeführt werden, weil du ein Zwischenergebnis ausgibst, da kann nicht optimiert werden.</p>
<p>Ist nur eine Vermutung, klingt für mich aber plausibel. <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/2272631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272631</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:46:22 GMT]]></title><description><![CDATA[<p>mantiz schrieb:</p>
<blockquote>
<p>Ist jetzt nur eine Vermutung, aber evtl. wird die Addition im letzten Fall einfach wegoptimiert, da sinnlos.</p>
</blockquote>
<p>Nein, Fließkommaoperationen können in der Regel nicht wegoptimiert werden, da die Regeln sehr kompliziert sind. Siehe eben dieses Beispiel, wieso das nicht einfach alles weggekürzt werden kann. Es ist schon immer wieder für eine Überraschung gut, wenn gewisse Operationen zur Compilezeit durchgeführt werden (das könnte hier übrigens tatsächlich passieren, wenn man die Optimierungen anschaltet), weil die dann auch gerne mal mit anderer Präzision durchgeführt werden als man das erwarten würde (z.B. mit 64-Bit-Genauigkeit, anstatt mit 80-Bit). Ich habe oben schon genau erklärt, was vermutlich passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272633</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:46:22 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:46:10 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Also 1.19209e-07 ist in der &quot;recheninternen Repräsentation&quot; einmal die Mantisse 1.19209 sowie der Exponent e-07, sowie die jeweiligen Vorzeichen bits der beiden.</p>
</blockquote>
<p>Nö - Dein PC denkt binär, nicht dezimal</p>
<p>climits schrieb:</p>
<blockquote>
<p>für die binäre Darstellung aller Werte müsst ich mich erst mal ne Weile hinhocken.</p>
</blockquote>
<p>rechne mal 2^-23 aus <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/2272634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272634</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:52:52 GMT]]></title><description><![CDATA[<p>Wobei ich aber nicht sehe, wo hier die cancellation zum Tragen kommt. s1 = a+b = 1.0000001234567 gibt ja gerundet auf 6 Nachkommstellen wieder 1.000000. s1 + c = 1.000000 - 1.000000 müsste ja dann 0 ergeben ???</p>
<p>Edit<br />
@ Walter<br />
Oh eh, verblüffend <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/2272636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272636</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:51:36 GMT]]></title><description><![CDATA[<p>Rechne deinen Code z.B. mal mit setprecision(20), dann wirst du erkennen, dass bei den bei den ersten ausgegebenen Werten auf den letzten Nachkommastellen ein Unterschied ist, obwohl nur 1 subtrahiert wurde</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272637</guid><dc:creator><![CDATA[xStrykex]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:53:14 GMT]]></title><description><![CDATA[<p>xStrykex schrieb:</p>
<blockquote>
<p><a href="http://www.tutorials.de/c-c/381980-problem-gleitkommatypen-assoziativgesetz.html#post1975101" rel="nofollow">http://www.tutorials.de/c-c/381980-problem-gleitkommatypen-assoziativgesetz.html#post1975101</a></p>
</blockquote>
<p>wenn du die nicht geltende assoziativität meinst ist das nichts neues. dass es ungeneuigkeiten gibt beim rechnen mit gleitkomma zahlen lernt men sehr schnell. dass man diesem &quot;phänomen&quot; einen name gibt bzw. es mit fehlender assoziativiät ausdrückt kam bei uns dann im ersten semester in der programmier vorlesung</p>
<p>kleines beispiel:</p>
<pre><code>float x = 2304.0f;
float y = -4096.0f;
float z = 4096.001953125f;

float e1 = x*(y+z);
float e2 = x*y + x*z;

cout &lt;&lt; e1 &lt;&lt; &quot; == &quot; &lt;&lt; e2 &lt;&lt; &quot; (laut der Mathematik!)&quot; &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2272639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272639</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:53:21 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>die 1.234567e-7 kann ich nachvollziehen.</p>
</blockquote>
<p>.. glaub' ich nicht. Ersetze mal Zeile 13 durch</p>
<pre><code>std::cout &lt;&lt; b+c+a &lt;&lt; std::endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2272640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272640</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 09:55:36 GMT]]></title><description><![CDATA[<p>Hier noch was zum Spielen:<br />
<a href="http://www.binaryconvert.com/index.html" rel="nofollow">http://www.binaryconvert.com/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272642</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Nov 2012 09:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 10:01:58 GMT]]></title><description><![CDATA[<p>whuups, wo sind denn die ganzen Antworten hergekommen?<br />
Ich glaub ich muss das dann wirklich erstmal rein binär machen, damit es Sinn ergibt. Danke für die vielen Antworten. Muss ich mal alles durchgehen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272644</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 20 Nov 2012 10:01:58 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 10:02:50 GMT]]></title><description><![CDATA[<p>naja, übertreiben muss mans nicht.</p>
<p>versuch einfach mal die 3.75 binär darzustellen (da reichen 8bit locker aus)<br />
und danach fängst du mal die 3.6 an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272645</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 20 Nov 2012 10:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 10:08:03 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>mantiz schrieb:</p>
<blockquote>
<p>Ist jetzt nur eine Vermutung, aber evtl. wird die Addition im letzten Fall einfach wegoptimiert, da sinnlos.</p>
</blockquote>
<p>Nein, Fließkommaoperationen können in der Regel nicht wegoptimiert werden, da die Regeln sehr kompliziert sind. Siehe eben dieses Beispiel, wieso das nicht einfach alles weggekürzt werden kann. Es ist schon immer wieder für eine Überraschung gut, wenn gewisse Operationen zur Compilezeit durchgeführt werden (das könnte hier übrigens tatsächlich passieren, wenn man die Optimierungen anschaltet), weil die dann auch gerne mal mit anderer Präzision durchgeführt werden als man das erwarten würde (z.B. mit 64-Bit-Genauigkeit, anstatt mit 80-Bit). Ich habe oben schon genau erklärt, was vermutlich passiert.</p>
</blockquote>
<p>Ok, auch wenn es nicht wegoptimiert wird, so ergibt sich durch die rechts-assioziativität von &quot;+&quot;, dass erst &quot;b+c&quot; gerechnet wird, was &quot;0&quot; ergibt, also bleibt nur &quot;a&quot; übrig, was von den Auswirkungen her das gleiche ist. <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>
<p>Hab's jetzt nur mal schnell im Taschenrechner nachvollzogen, wenn ich &quot;a+b&quot; auf 8 Nachkommastellen abschneide und anschließend &quot;+c&quot;, also &quot;-1&quot; rechne, dann lande ich bei &quot;1,19...e-7&quot;. Die Nachkommastellen unterscheiden sich zwar noch, aber mir ist das Ergebnis nah genug dran. Dann würde ich das also auf die rechts-assioziativität schieben. <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/2272650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272650</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 20 Nov 2012 10:08:03 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 10:16:38 GMT]]></title><description><![CDATA[<p>mantiz schrieb:</p>
<blockquote>
<p>Hab's jetzt nur mal schnell im Taschenrechner nachvollzogen, wenn ich &quot;a+b&quot; auf 8 Nachkommastellen abschneide und anschließend &quot;+c&quot;, also &quot;-1&quot; rechne, dann lande ich bei &quot;1,19...e-7&quot;. Die Nachkommastellen unterscheiden sich zwar noch, aber mir ist das Ergebnis nah genug dran. Dann würde ich das also auf die rechts-assioziativität schieben. <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>
</blockquote>
<p>Tja, nur leider kommt bei c + b + a auch 1.23457e-07 heraus:<br />
<a href="http://ideone.com/RAuLpg" rel="nofollow">http://ideone.com/RAuLpg</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272655</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Nov 2012 10:16:38 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 10:29:48 GMT]]></title><description><![CDATA[<p>Ok, ich gebe auf. <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>Bei &quot;c + a + b&quot; tritt der &quot;Fehler&quot; übrigens auf: <a href="http://ideone.com/OOQr41" rel="nofollow">http://ideone.com/OOQr41</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272665</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 20 Nov 2012 10:29:48 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Tue, 20 Nov 2012 10:35:10 GMT]]></title><description><![CDATA[<p>mantiz schrieb:</p>
<blockquote>
<p>Ok, ich gebe auf. <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>Bei &quot;c + a + b&quot; tritt der &quot;Fehler&quot; übrigens auf: <a href="http://ideone.com/OOQr41" rel="nofollow">http://ideone.com/OOQr41</a></p>
</blockquote>
<p>Und deswegen muss man immer genau aufpassen, welche Größenordnungen bei Zahlen zu erwarten sind und wie man daher seine Ausdrücke genau aufschreibt. Numerik ist nicht einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272667</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Nov 2012 10:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to Widersprüchliche Rechenergebnisse on Wed, 21 Nov 2012 06:12:48 GMT]]></title><description><![CDATA[<p>Hab das Problem mit der numerischen Auslöschung jetzt weitgehend hinterstiegen. Der ganze Rest mit fehlender Assoziativität und so weiter ist dann aber scheinbar doch noch etwas komplizierter.<br />
Um hier noch auf einzelne Posts einzugehen:</p>
<p>Werner_logoff schrieb:</p>
<blockquote>
<p>climits schrieb:</p>
<blockquote>
<p>die 1.234567e-7 kann ich nachvollziehen.</p>
</blockquote>
<p>.. glaub' ich nicht. Ersetze mal Zeile 13 durch</p>
<pre><code>std::cout &lt;&lt; b+c+a &lt;&lt; std::endl;
</code></pre>
</blockquote>
<p>Kommt bei mir wieder das selbe, also 1.234567e-7 raus, was aber auch nicht verwunderlich ist denn auch hier..</p>
<p>mantiz schrieb:</p>
<blockquote>
<p>Bei &quot;c + a + b&quot; tritt der &quot;Fehler&quot; übrigens auf: <a href="http://ideone.com/OOQr41" rel="nofollow">http://ideone.com/OOQr41</a></p>
</blockquote>
<p>Tritt der Fehler bei mir nicht auf, bzw. ich kriege wieder 1.234567e-7 statt 1.19209e-07 ausgegeben. Keine Ahnung woran das liegt. Vielleicht weil ich einen AMD nutze? Mit Rechenarchitektur kenn ich mich nun überhaupt nicht aus.<br />
Wundern tut es mich aber dass es zumindest bei mantiz und auf der Internetseite tatsächlich einen Unterschied macht, ob man nun a+b+c oder c+a+b rechnet. Da wird in einem Fall dann wie SeppJ meinte, wohl das &quot;Rechenwerk&quot; mit 80 bit genutzt (oder SSE, x87...) und im anderem Fall aus irgendwelchen Gründen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2272995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2272995</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Wed, 21 Nov 2012 06:12:48 GMT</pubDate></item></channel></rss>