<?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[Rundungsfehler]]></title><description><![CDATA[<p>Hallo,</p>
<p>was verursacht weniger Rundungsfehler und warum?</p>
<pre><code class="language-cpp">double sum = 0;
for(int i = 0; i &lt; N; ++i)
{
  sum += data[i] / N;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">double sum = 0;
for(int i = 0; i &lt; N; ++i)
{
  sum += data[i];
}
sum /= N;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/312132/rundungsfehler</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 02:48:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312132.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Dec 2012 17:28:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 17:28:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>was verursacht weniger Rundungsfehler und warum?</p>
<pre><code class="language-cpp">double sum = 0;
for(int i = 0; i &lt; N; ++i)
{
  sum += data[i] / N;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">double sum = 0;
for(int i = 0; i &lt; N; ++i)
{
  sum += data[i];
}
sum /= N;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2283171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283171</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Tue, 25 Dec 2012 17:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 17:34:05 GMT]]></title><description><![CDATA[<p>Kommt drauf an (das ist das Beste, was ich dazu sagen kann).<br />
-Welchen wert hat N (power of two?)<br />
-variieren die Werte von data[i] stark oder sind die alle in einem &quot;Bereich&quot;</p>
<p>usw....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283177</guid><dc:creator><![CDATA[asdfasdf]]></dc:creator><pubDate>Tue, 25 Dec 2012 17:34:05 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 17:37:12 GMT]]></title><description><![CDATA[<p>Suchst du vielleicht das?<br />
<a href="http://en.wikipedia.org/wiki/Kahan_summation_algorithm" rel="nofollow">http://en.wikipedia.org/wiki/Kahan_summation_algorithm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283180</guid><dc:creator><![CDATA[Kahan]]></dc:creator><pubDate>Tue, 25 Dec 2012 17:37:12 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 17:39:29 GMT]]></title><description><![CDATA[<p>im konkreten Fall ist N = 7291<br />
die werte in data sind im bereich 0..1000 ganzzahlig mit ziemlich vielen 0e. Ein paar Beispielwerte aus dem array:<br />
0 0 0 0 0 0 0 184 931 416 0 0 0 0 0 0<br />
0 0 0 0 0 0 4 648 1000 653 0 0 0 0 0 0</p>
<p>Kannst du etwas näheres zum Zusammenhang zur Größe der Werte sagen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283181</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Tue, 25 Dec 2012 17:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 17:48:33 GMT]]></title><description><![CDATA[<p>asdfasdf schrieb:</p>
<blockquote>
<p>Kommt drauf an (das ist das Beste, was ich dazu sagen kann).<br />
-Welchen wert hat N (power of two?)</p>
</blockquote>
<p>Ja, wenn N eine Zweierpotenz ist, dann sollte es egal sein. Aber dann ist das zweite im Zweifelsfall schneller sein.</p>
<blockquote>
<p>-variieren die Werte von data[i] stark oder sind die alle in einem &quot;Bereich&quot;</p>
</blockquote>
<p>Das sollte beides keinen Einfluss haben, da man die Bereiche gleichmäßig skaliert. Dann ist auch das zweite im Zweifelsfalls schneller und auch genauer, da weniger Operationen durchgeführt werden und somit weniger Zwischenergebnisse anfallen.</p>
<p>Q schrieb:</p>
<blockquote>
<p>Kannst du etwas näheres zum Zusammenhang zur Größe der Werte sagen?</p>
</blockquote>
<p>Es ist numerisch ungünstig, Werte von stark unterschiedlicher Größenordnung zu addieren. Besonders, wenn man es sehr oft macht. Denn dann bekommt man (im Vergleich zum kleineren Summand) einen großen relativen Fehler. Beispiel: Du hast 7 Dezimalstellen Rechengenauigkeit und möchtest rechnen 1234567 + 0.1234567. Beide Zahlen sind auf sieben Stellen bekannt, aber das Ergebnis ist 1234567, da das Ergebnis wieder nur auf sieben Stellen genau ist und man hat somit die komplette Information über die 0.1234567 verloren.<br />
Bei deinen beiden Varianten sollte dies keinen Unterschied machen, da es egal ist, ob man die Summanden vorher mit N skaliert oder nicht, die Verhältnisse bleiben schließlich gleich.</p>
<p>Man kann sich aber überlegen, wie man an sich diese Art Fehler vermeiden kann (und ob dies überhaupt nötig ist). Ein Weg wurde dir genannt, es gibt noch viele andere, findest du in Numerikbüchern. Meistens ist diese Art von Fehler jedoch eher unwichtig, da gibt es viel Schlimmeres, was man versehentlich machen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283183</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 25 Dec 2012 17:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 17:43:22 GMT]]></title><description><![CDATA[<p>Kahan schrieb:</p>
<blockquote>
<p>Suchst du vielleicht das?<br />
<a href="http://en.wikipedia.org/wiki/Kahan_summation_algorithm" rel="nofollow">http://en.wikipedia.org/wiki/Kahan_summation_algorithm</a></p>
</blockquote>
<p>Danke für den link. Das ist sicherlich die beste variante, mir nur für den Anwendungsfall hier zu aufwändig.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Das sollte beides keinen Einfluss haben, da man die Bereiche gleichmäßig skaliert. Dann ist auch das zweite im Zweifelsfalls schneller und auch genauer, da weniger Operationen durchgeführt werden und somit weniger Zwischenergebnisse anfallen.</p>
</blockquote>
<p>Also nur am Ende teilen, ok danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283184</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Tue, 25 Dec 2012 17:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 18:08:49 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das sollte beides keinen Einfluss haben, da man die Bereiche gleichmäßig skaliert. Dann ist auch das zweite im Zweifelsfalls schneller und auch genauer, da weniger Operationen durchgeführt werden und somit weniger Zwischenergebnisse anfallen.</p>
</blockquote>
<p>Ok, Ich gebe zu, dass das Beispiel etwas konstruiert ist, aber hier ist es nicht egal <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>
<pre><code>int main()
{
    float arr[] = {16777218.f, 9.f, 6.f};
    float a=0.f, b=0.f;

    for(unsigned i=0; i!=3; ++i)
        a+=arr[i];
    a/=3.f;

    for(unsigned i=0; i!=3; ++i)
        b+=(arr[i]/3.f);

    //a = 5592411.5
    //b = 5592411   (richtig)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2283202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283202</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Tue, 25 Dec 2012 18:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to Rundungsfehler on Tue, 25 Dec 2012 19:06:49 GMT]]></title><description><![CDATA[<p>Da hatte ich leicht etwas anderes gemeint. Ich dachte du wolltest allgemein auf Fehler durch zu unterschiedlich große Bereiche hinaus. Du demonstrierst hier</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Dann ist auch das zweite im Zweifelsfalls schneller und <strong>auch genauer</strong>, da weniger Operationen durchgeführt werden und somit weniger Zwischenergebnisse anfallen.</p>
</blockquote>
<p>Die Rundungsfehler entstehen hier, da 3 keine Zweierpotenz ist. Bei einer Zweierpotenz sollte sogar exakt das gleiche herauskommen (außer du konstruierst ein Beispiel, bei dem der Exponent über- bzw. unterläuft.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283219</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 25 Dec 2012 19:06:49 GMT</pubDate></item></channel></rss>