<?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[Seltsame Rundungsfehler]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich versuche mich gerade an einem Beispiel, eine double Zahl in Zähler und Nenner umzuwandeln. Beim Versuch, die Zahl so lange mit 10 zu multiplizieren, bis keine Nachkommastelle mehr übrig bleibt, bin ich aber in eine Endlosschleife geraten. Folgendes Minimalbeispiel...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
using namespace std;

int main(void)
{
double dbl=1.234, tst1, tst2;

    tst1=floor(dbl*1000);
    tst2=dbl*1000;
    cout &lt;&lt; tst1 &lt;&lt; endl &lt;&lt; tst2 &lt;&lt; endl;

    if (tst1 != tst2)
        cout &lt;&lt; &quot;1) Something is wrong!?&quot; &lt;&lt; endl;

    if (floor(dbl*1000) != dbl*1000)
        cout &lt;&lt; &quot;2) Something is wrong!?&quot; &lt;&lt; endl;
}
</code></pre>
<p>...erzeugt bei mir überraschenderweise folgende Ausgabe:</p>
<pre><code>1234
1234
2) Something is wrong!?
</code></pre>
<p>Das kann aber nicht sein, oder? Ist an dem Code was falsch? Wie kann es sein, dass ein Unterschied besteht, ob die Werte in doubles gespeichert werden oder ob sie direkt verglichen werden? Vielleicht ist das Phänomen plattformspezifisch, daher:</p>
<pre><code>$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang
    --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib
    --without-included-gettext --enable-threads=posix --enable-nls
    --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
    --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
    --enable-mpfr --disable-libmudflap --enable-targets=all
    --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
    --target=i486-linux-gnu
Thread model: posix
gcc version 4.2.3 (Debian 4.2.3-1)
$ uname -r -v
2.6.22-3-686 #1 SMP Sun Feb 10 20:20:49 UTC 2008
</code></pre>
<p>Mit einem Debugger hab ich bisher noch nie gearbeitet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207283/seltsame-rundungsfehler</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 05:04:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207283.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Mar 2008 16:40:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Seltsame Rundungsfehler on Wed, 05 Mar 2008 16:40:48 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich versuche mich gerade an einem Beispiel, eine double Zahl in Zähler und Nenner umzuwandeln. Beim Versuch, die Zahl so lange mit 10 zu multiplizieren, bis keine Nachkommastelle mehr übrig bleibt, bin ich aber in eine Endlosschleife geraten. Folgendes Minimalbeispiel...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
using namespace std;

int main(void)
{
double dbl=1.234, tst1, tst2;

    tst1=floor(dbl*1000);
    tst2=dbl*1000;
    cout &lt;&lt; tst1 &lt;&lt; endl &lt;&lt; tst2 &lt;&lt; endl;

    if (tst1 != tst2)
        cout &lt;&lt; &quot;1) Something is wrong!?&quot; &lt;&lt; endl;

    if (floor(dbl*1000) != dbl*1000)
        cout &lt;&lt; &quot;2) Something is wrong!?&quot; &lt;&lt; endl;
}
</code></pre>
<p>...erzeugt bei mir überraschenderweise folgende Ausgabe:</p>
<pre><code>1234
1234
2) Something is wrong!?
</code></pre>
<p>Das kann aber nicht sein, oder? Ist an dem Code was falsch? Wie kann es sein, dass ein Unterschied besteht, ob die Werte in doubles gespeichert werden oder ob sie direkt verglichen werden? Vielleicht ist das Phänomen plattformspezifisch, daher:</p>
<pre><code>$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang
    --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib
    --without-included-gettext --enable-threads=posix --enable-nls
    --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
    --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
    --enable-mpfr --disable-libmudflap --enable-targets=all
    --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
    --target=i486-linux-gnu
Thread model: posix
gcc version 4.2.3 (Debian 4.2.3-1)
$ uname -r -v
2.6.22-3-686 #1 SMP Sun Feb 10 20:20:49 UTC 2008
</code></pre>
<p>Mit einem Debugger hab ich bisher noch nie gearbeitet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1468914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468914</guid><dc:creator><![CDATA[paux]]></dc:creator><pubDate>Wed, 05 Mar 2008 16:40:48 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsame Rundungsfehler on Wed, 05 Mar 2008 17:14:05 GMT]]></title><description><![CDATA[<p>paux schrieb:</p>
<blockquote>
<p>Ich versuche mich gerade an einem Beispiel, eine double Zahl in Zähler und Nenner umzuwandeln.</p>
</blockquote>
<p>Dann sollte dieser Beitrag über die <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-198886-and-postdays-is-0-and-postorder-is-asc-and-start-is-28.html" rel="nofollow">Umwandlung einer Gleitkommazahl in einen Bruch</a> weiterhelfen ...</p>
<p>paux schrieb:</p>
<blockquote>
<p>Das kann aber nicht sein, oder? Ist an dem Code was falsch? Wie kann es sein, dass ein Unterschied besteht, ob die Werte in doubles gespeichert werden oder ob sie direkt verglichen werden?</p>
</blockquote>
<p>doch das macht einen Unterschied. Wenn die berechneten Werte direkt verglichen werden, so befinden sie sich noch in den Registern der CPU. Wenn diese genauer rechnet als die Zahlen im Speicher abgelegt werden - und das sollte sie normalerweise tun - so sind die Zahlen im Speicher nur gerundete Kopien also nicht zwingend identisch.</p>
<p>Dein Rechner arbeitet übrigens immer im Binärsystem und die (dezimale) Zahl 1.234 ist im Binärsystem nicht exakt darstellbar.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1468934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468934</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 05 Mar 2008 17:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsame Rundungsfehler on Wed, 05 Mar 2008 17:16:52 GMT]]></title><description><![CDATA[<p>Teste doch, ob die Differenz in einer Epsilon-Umgebung liegt:</p>
<p>if (abs(floor(dbl*1000) - dbl*1000) &gt; 0.01)<br />
cout &lt;&lt; &quot;2) Something is wrong!?&quot; &lt;&lt; endl;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1468937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468937</guid><dc:creator><![CDATA[witte_]]></dc:creator><pubDate>Wed, 05 Mar 2008 17:16:52 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsame Rundungsfehler on Wed, 05 Mar 2008 17:48:03 GMT]]></title><description><![CDATA[<p>Danke euch beiden!<br />
Hätte nicht gedacht dass das so nichttrivial sein könnte, sowohl was die Aufgabenstellung betrifft als auch dass man recht schnell tiefe Hardwarekenntnisse braucht. Hätte auch nicht gedacht hier ebenfalls schon Epsilontik zu brauchen.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1468958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1468958</guid><dc:creator><![CDATA[paux]]></dc:creator><pubDate>Wed, 05 Mar 2008 17:48:03 GMT</pubDate></item></channel></rss>