<?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[Hilfe! 0.2 - 0.2 &amp;lt; 0]]></title><description><![CDATA[<p>Ich habe ein Problem mit 2 double-Variablen. Haben beispielsweise beide den Wert 0.2, und ich ziehe sie voneinander ab, so erhalte ich -1.11022 * 10^-16 anstelle von 0. Was kann ich dagegen tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/133410/hilfe-0-2-0-2-lt-0</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 22:38:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/133410.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jan 2006 14:58:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 14:58:08 GMT]]></title><description><![CDATA[<p>Ich habe ein Problem mit 2 double-Variablen. Haben beispielsweise beide den Wert 0.2, und ich ziehe sie voneinander ab, so erhalte ich -1.11022 * 10^-16 anstelle von 0. Was kann ich dagegen tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/968992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/968992</guid><dc:creator><![CDATA[Evolver]]></dc:creator><pubDate>Tue, 17 Jan 2006 14:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:03:53 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Da gibt es immer Probleme, weil irgendwelche Kommastellen mitgerechnet werden. Ich habe da mal Stunden mit einer if-Abfrage verbracht.</p>
<p>Vielleicht wissen die Profis ja Hilfe.</p>
<p>chrische</p>
]]></description><link>https://www.c-plusplus.net/forum/post/968999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/968999</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:07:38 GMT]]></title><description><![CDATA[<p>double-Variablen sind beim Subtrahieren ungenau. Außerdem kann der Wert 0.2 binär nicht dargestellt werden, stattdessen wird ein sehr ähnlicher Wert verwendet. Die beiden Fehler pflanzen sich in allen weiteren Rechnungen fort. Die Ausgabestreams von C++ zeigen aber trotzdem 0.2 an, weil sie eine festgelegte Anzahl an Nachkommastellen haben. In Wirklichkeit hat die Variable aber einen anderen Wert als 0.2. Bei floats und doubles sollte man deswegen nie auf == testen sondern überprüfen, ob zwei Werte ähnlich sind (mit &gt;= und &lt;=).<br />
geloescht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969004</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:10:01 GMT]]></title><description><![CDATA[<p>Hehe, schön nur muss ich testen, ob die Differenz der beider kleiner 0 ist. Lösungsvorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969009</guid><dc:creator><![CDATA[Evolver]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:12:19 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Benutz &lt;=.</p>
<p>chrische</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969013</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:16:21 GMT]]></title><description><![CDATA[<p>Das nützt mir doch nichts. Folgendes Konstrukt habe ich:<br />
rest = w1 - w2;<br />
if( rest&lt;0 ) ...</p>
<p>Wenn ich das ersetze durch<br />
if( !(rest&gt;=0) ) ...<br />
bleibt das Problem bestehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969019</guid><dc:creator><![CDATA[Evolver]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:18:43 GMT]]></title><description><![CDATA[<p>Teste nicht die Differenz der beiden Zahlen, sondern teste die Zahlen direkt gegeneinander. Die Ungleichung a - b &lt; 0 kann man in a &gt; b umformen. Je nach deiner Anwendung braucht man vielleicht noch std::abs() aus &lt;cmath&gt;. Das sollte zumindest den Subtraktions-Fehler rausnehmen (Fehler mit evt. nicht darstellbaren Zahlen sind immer noch da).<br />
geloescht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969023</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 15:34:06 GMT]]></title><description><![CDATA[<p>Evolver schrieb:</p>
<blockquote>
<p>Hehe, schön nur muss ich testen, ob die Differenz der beider kleiner 0 ist. Lösungsvorschläge?</p>
</blockquote>
<p>4.0 - 6.0 ist kleiner Null. Also sind die Werte gleich!? Ich glaub, ich bin im falschen Universum <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>Nein, erstmal musst Du festlegen, wieviel Unterscheid in den Zahlen noch als gleich gelten darf. Nehmen wir an, Du arbeitest mit Metern und hättest gerne eine Genauigkeit von einem Millimeter. Dann ist 0.001 und 0.0011 etwa das selbe.</p>
<p>Wenn man jetzt davon ausgeht, dass Du mit den Zahlen auch noch rechnest, sollte darf die Genauigkeit auch etwas genauer ausfallen, um Rundungsfehler zu verringern. In der Ausgabe kann man immernoch brachial alles hinter der dritten Stelle wegrunden.</p>
<p>Dann sieht ein Vergleich so aus:</p>
<p>const double MAXDELTA = 0.0000001<br />
double a = 0.001, b = 0.00011;</p>
<pre><code class="language-cpp">if( abs(a-b) &lt;= MAXDELTA ) printf( &quot;Die Werte sind [etwa] gleich&quot; );
else                       printf( &quot;Die Werte sind verschieden&quot; );
</code></pre>
<p>Das kannst Du dann in eine inline-Funktion packen:</p>
<pre><code class="language-cpp">inline bool equal( double a, double b )
  return abs( a-b ) &lt;= MAXDELTA;
</code></pre>
<p>und anschließend in Deinem Programm nutzen:</p>
<pre><code class="language-cpp">if( equals( a, b ) ) printf( &quot;Die Werte sind [etwa] gleich&quot; );
else                 printf( &quot;Die Werte sind verschieden&quot; );
</code></pre>
<p>Rechnen mit Doubles macht Spaß, gibt viele schöne Möglichkeiten, sein Ergebnis anständig zu versauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969038</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Tue, 17 Jan 2006 15:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 16:38:05 GMT]]></title><description><![CDATA[<p>Hmm, ich bin am verzweifeln. Auch das funktioniert nicht. Wahrscheinlich sitz ich heut schon zu lang davor, um den Fehler zu finden.</p>
<pre><code class="language-cpp">#define MAXDIFF 0.00001
...
double rest_g = TA-&gt;g_lv;
for(int i=0; i&lt;anzX; i++)
{
    if(TA-&gt;x[index[i&rsqb;&rsqb;==LEER) rest_g -= g[index[i&rsqb;&rsqb;;
    if(abs(rest_g)&lt;=MAXDIFF)
    {
        TA-&gt;alpha = i;
        break;
    }    
}
...
</code></pre>
<p>So funktioniert der Vergleich noch nichtmal, wenn ich ganzzahlige Werte eingebe. Wo liegt denn mein Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969102</guid><dc:creator><![CDATA[Evolver]]></dc:creator><pubDate>Tue, 17 Jan 2006 16:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Tue, 17 Jan 2006 17:13:51 GMT]]></title><description><![CDATA[<p>Aso:<br />
if((rest_g&lt;0) &amp;&amp; (abs(rest_g)&gt;MAXDIFF))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969127</guid><dc:creator><![CDATA[Evolver]]></dc:creator><pubDate>Tue, 17 Jan 2006 17:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe! 0.2 - 0.2 &amp;lt; 0 on Wed, 18 Jan 2006 08:55:54 GMT]]></title><description><![CDATA[<p>Evolver schrieb:</p>
<blockquote>
<p>Hmm, ich bin am verzweifeln. Auch das funktioniert nicht. Wahrscheinlich sitz ich heut schon zu lang davor, um den Fehler zu finden.</p>
<pre><code class="language-cpp">#define MAXDIFF 0.00001
...
double rest_g = TA-&gt;g_lv;
for(int i=0; i&lt;anzX; i++)
{
    if(TA-&gt;x[index[i&rsqb;&rsqb;==LEER) rest_g -= g[index[i&rsqb;&rsqb;;
    if(abs(rest_g)&lt;=MAXDIFF)
    {
        TA-&gt;alpha = i;
        break;
    }    
}
...
</code></pre>
<p>So funktioniert der Vergleich noch nichtmal, wenn ich ganzzahlige Werte eingebe. Wo liegt denn mein Fehler?</p>
</blockquote>
<p>Hier findet kein Vergleich auf in Relation zu 0 statt, sondern hier wird gefragt, ob etwas kleiner 0 ist. -1000 ist auch kleiner als Null, aber liegt ausserhalb Deines Deltas.</p>
<p>Evolver schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if((rest_g&lt;0) &amp;&amp; (abs(rest_g)&gt;MAXDIFF))
</code></pre>
</blockquote>
<p>Was machst Du, wenn rest_g positiv ist, aber trotzdem im Bereich von MaxDelta liegt? Dann greift die Bedingung nicht!?</p>
<p>Was willst Du denn überhaupt vergleichen, möchtest Du Fragen, ob etwas etwa 0 ist, dann benutze doch einfach die Equals-Funktion, die ich oben notiert habe.<br />
Oder möchtest Du Fragen, ob etwas kleiner 0 ist und weiter als MAXDELTA von 0 entfernt?</p>
<pre><code class="language-cpp">if( (rest_g&lt;0) &amp;&amp; !Equals( rest_g, 0 ) ) ... // entspricht rest_g &lt; 0 für integers
</code></pre>
<p>oder etwas spezialisierter (=&gt; schneller):</p>
<pre><code class="language-cpp">if( (rest_g&lt;0) &amp;&amp; rest_g &lt; (-MAXDELTA) ) ) ... // entspricht rest_g &lt; 0 für integers
</code></pre>
<p>Ich hoffe Dir bei Deinem Problem helfen zu können, aber ich weiß nicht genau weiß, was Dein Problem letztendlich überhaupt ist/war?<br />
Falls nicht, beschreib' es bitte genauer, das erspart das Rumraten und beschleunigt für Dich die Antwort <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/969496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969496</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Wed, 18 Jan 2006 08:55:54 GMT</pubDate></item></channel></rss>