<?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[Vergleich von float]]></title><description><![CDATA[<p>Vielleicht kann mir ja jemand folgendes merkwürdiges Verhalten erklären.</p>
<p>Ich vergleiche zwei float-Werte mit ==. In meinen Fall sollte das in Ordnung sein, da das im Rahmen einer Test-Funktion passiert, die überprüft, ob ein Wert richtig gesetzt wurde.</p>
<p>Die fragliche Zeile ist folgende:</p>
<pre><code>if (pc[i][j] != p[j]) {
</code></pre>
<p>Der if-Block wird betreten. Wenn ich beide Werte (pc[i][j] und pc[j]) ausgebe, werden exakt gleiche Zahlen angezeigt (auch mit setprecision(20)).</p>
<p>Jetzt wir es aber noch kurioser. Ich habe vor die Zeile mit &quot;if&quot; eine Ausgabe &quot;cout &lt;&lt; i &lt;&lt; endl;&quot; eingefügt. Plötzlich wird der if-Block nicht mehr betreten.</p>
<p>Gelöst hab ich das Problem, indem ich die Bedingnung zu</p>
<pre><code>if (reinterpret_cast&lt;const int&amp;&gt;(pc[i][j]) != reinterpret_cast&lt;const int&amp;&gt;(p[j])) {
</code></pre>
<p>geändert hab.</p>
<p>Ist das ganze eine sehr merkwürdige Optimierung des GCC (der Bug trat nur im Release-Modus auf) oder wie muss ich mir das jetzt erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325783/vergleich-von-float</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 21:59:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325783.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 May 2014 20:29:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vergleich von float on Sat, 17 May 2014 20:29:28 GMT]]></title><description><![CDATA[<p>Vielleicht kann mir ja jemand folgendes merkwürdiges Verhalten erklären.</p>
<p>Ich vergleiche zwei float-Werte mit ==. In meinen Fall sollte das in Ordnung sein, da das im Rahmen einer Test-Funktion passiert, die überprüft, ob ein Wert richtig gesetzt wurde.</p>
<p>Die fragliche Zeile ist folgende:</p>
<pre><code>if (pc[i][j] != p[j]) {
</code></pre>
<p>Der if-Block wird betreten. Wenn ich beide Werte (pc[i][j] und pc[j]) ausgebe, werden exakt gleiche Zahlen angezeigt (auch mit setprecision(20)).</p>
<p>Jetzt wir es aber noch kurioser. Ich habe vor die Zeile mit &quot;if&quot; eine Ausgabe &quot;cout &lt;&lt; i &lt;&lt; endl;&quot; eingefügt. Plötzlich wird der if-Block nicht mehr betreten.</p>
<p>Gelöst hab ich das Problem, indem ich die Bedingnung zu</p>
<pre><code>if (reinterpret_cast&lt;const int&amp;&gt;(pc[i][j]) != reinterpret_cast&lt;const int&amp;&gt;(p[j])) {
</code></pre>
<p>geändert hab.</p>
<p>Ist das ganze eine sehr merkwürdige Optimierung des GCC (der Bug trat nur im Release-Modus auf) oder wie muss ich mir das jetzt erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399674</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sat, 17 May 2014 20:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sat, 17 May 2014 20:46:51 GMT]]></title><description><![CDATA[<p>Warum denn kein Epsilonvergleich? Du wirst so nicht glücklich werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399675</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sat, 17 May 2014 20:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sat, 17 May 2014 20:54:04 GMT]]></title><description><![CDATA[<p>Das ist keine &quot;merkwürdige Optimierung des gcc&quot;, das ist dein Unsinnscast, der Probleme macht.<br />
Erkläre doch mal, was dein Cast bringen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399676</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Sat, 17 May 2014 20:54:04 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sat, 17 May 2014 21:18:35 GMT]]></title><description><![CDATA[<p>Warum ein Epsilonvergleich, wenn man weiß, dass die Werte EXAKT gleich sind. Exakt heißt hier, dass die Bitvektoren der beiden Werte übereinstimmen (deshalb funktioniert ja der reinterpret-cast).</p>
<p>Epsilonvergleich sagt sich immer so leicht. Ein einfaches <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∣</mi><mi>a</mi><mo>−</mo><mi>b</mi><mi mathvariant="normal">∣</mi><mo>&lt;</mo><mi>ϵ</mi></mrow><annotation encoding="application/x-tex">|a-b| &lt; \epsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathrm">∣</span><span class="mord mathit">a</span><span class="mbin">−</span><span class="mord mathit">b</span><span class="mord mathrm">∣</span><span class="mrel">&lt;</span><span class="mord mathit">ϵ</span></span></span></span> ist für ein konstantes <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ϵ</mi></mrow><annotation encoding="application/x-tex">\epsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">ϵ</span></span></span></span> aber murks, da man die Größenordnung von a und b nicht kennt. Also müsste <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ϵ</mi></mrow><annotation encoding="application/x-tex">\epsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">ϵ</span></span></span></span> von a und b abhängen, z.B. \epsion = (a+b)/10^9. Warum sollte <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><msup><mn>0</mn><mn>9</mn></msup></mrow><annotation encoding="application/x-tex">10^9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.8141079999999999em;"></span><span class="strut bottom" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathrm">1</span><span class="mord"><span class="mord mathrm">0</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord mathrm">9</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span> hier aber ein guter Wert sein? Vermutlich kann man ganze Paper darüber schreiben, wie man Fließkommazahlen vergleicht.</p>
<p>Wutz hat mich scheinbar falsch verstanden. Ich stimme zu, dass der Cast natürlich keine schöne Lösung ist, aber er liefert im Gegensatz zum direkten float-Vergleich korrekte Ergebnisse.</p>
<p>Was der Cast bringen soll? Naja, er verhindert, dass der gcc merkwürdige Optimierungen durchführt.</p>
<p>Um nochmal die Situation zu verdeutlichen.<br />
Ich habe sowas wie:</p>
<pre><code>std::vector&lt;float&gt; v;
float x = 1.7;
v.push_back(x);
if (v[0] != x) {
</code></pre>
<p>der if-Block dürfte meiner Meinung nach NIE betreten werden. In meinem Fall wurde der if-Block aber (in einer ähnlichen Situation) betreten (und zwar nur im Release-Modus).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399678</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sat, 17 May 2014 21:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sat, 17 May 2014 22:02:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Vermutlich kann man ganze Paper darüber schreiben, wie man Fließkommazahlen vergleicht.</p>
</blockquote>
<p>Ja, das gibt es auch: <a href="http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/" rel="nofollow">http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/</a></p>
<blockquote>
<p>Das ist keine &quot;merkwürdige Optimierung des gcc&quot;, das ist dein Unsinnscast, der Probleme macht.</p>
</blockquote>
<p>Den Cast hat er eingefügt, <strong>nachdem</strong> der Bug auftrat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399682</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 17 May 2014 22:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sun, 18 May 2014 00:43:34 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Den Cast hat er eingefügt, <strong>nachdem</strong> der Bug auftrat.</p>
</blockquote>
<p>Ja, aber der ist doch trotzdem Quatsch. Wenn die beiden Floats ein identisches Bitpattern haben, wird auch ein normaler Floatvergleich true ergeben. Das Problem tritt doch dann auf, wenn sie nicht das gleiche Bitpattern haben, obwohl die Operanden gleich wären, hätte man die Rechnung mit reellen Zahlen durchgeführt.</p>
<p>Lesen:<br />
<a href="http://www.cs.ucdavis.edu/~bai/ECS231/Goldberg91.pdf" rel="nofollow">http://www.cs.ucdavis.edu/~bai/ECS231/Goldberg91.pdf</a> (PDF)<br />
<a href="http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html" rel="nofollow">http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html</a> (HTML)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28594">@Ramanujan</a>: deine Erklärung für die Beobachtung passt nicht. Entweder hast du was übersehen oder die Ursache liegt ganz woanders. Zeig mal bitte die Zuweisung und Deklarationen der beteiligten Variablen. Möglichst aus dem echten Code, mit dem der Fehler auftritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399691</guid><dc:creator><![CDATA[alman]]></dc:creator><pubDate>Sun, 18 May 2014 00:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sun, 18 May 2014 00:46:02 GMT]]></title><description><![CDATA[<p>Und ja, du hast völlig Recht, dass in der geschilderten Situation ein Epsilonvergleich o.ä. völlig unnötig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399693</guid><dc:creator><![CDATA[alman]]></dc:creator><pubDate>Sun, 18 May 2014 00:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sun, 18 May 2014 00:51:02 GMT]]></title><description><![CDATA[<p>Achso: was heißt denn bitte Releasemodus in Bezug auf GCC? Der kennt sowas nicht. <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="😉"
    /> Genauer Compileraufruf wäre hilfreich.</p>
<p>Bitte entschuldigt die mehrfachen Beiträge. Nächstes Mal überlege ich vor dem ersten Absenden, ob ich nicht noch was anderes schreiben will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399694</guid><dc:creator><![CDATA[alman]]></dc:creator><pubDate>Sun, 18 May 2014 00:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sun, 18 May 2014 09:07:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja, aber der ist doch trotzdem Quatsch. Wenn die beiden Floats ein identisches Bitpattern haben, wird auch ein normaler Floatvergleich true ergeben.</p>
</blockquote>
<p>Das ist mir klar.</p>
<p>Deine Links sind übrigens völlig outdated (oder ist das hier egal?).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399710</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 18 May 2014 09:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sun, 18 May 2014 11:45:50 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Deine Links sind übrigens völlig outdated (oder ist das hier egal?).</p>
</blockquote>
<p>Die sind von 1991. Seitdem hat sich bei den Grundlagen der Gleitkommaarithmetik nichts getan. Selbst wenn es noch älter wäre (aus einer Zeit vor IEEE-754 z.B.), wäre das Paper noch lesenswert. Ob man jetzt die eine oder andere Implementierung zur Illustration verwendet, ist nicht so wichtig. IEEE-Floats sind halt praxisnäher.</p>
<p>Genau die erklärt der Artikel aber eben schon und ist damit trotz seines Alters topaktuell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399726</guid><dc:creator><![CDATA[alman]]></dc:creator><pubDate>Sun, 18 May 2014 11:45:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleich von float on Sun, 18 May 2014 18:43:04 GMT]]></title><description><![CDATA[<p>Releasemodus heißt in meinem Fall &quot;-O2&quot;.</p>
<p>Der Compileraufruf ist:</p>
<pre><code>g++ -c -pipe -fno-keep-inline-dllexport -O2 -std=c++0x -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -I../RangeClustering -I'.' -I'../../5.2.1/mingw48_32/mkspecs/win32-g++' -o release/Test.o ../RangeClustering/Test.cpp
</code></pre>
<p>Ich hab meinen Code mal als zip-Archiv hochgeladen:<br />
<a href="http://depot.tu-dortmund.de/get/6e6ru" rel="nofollow">http://depot.tu-dortmund.de/get/6e6ru</a></p>
<p>Die Bedingung steht in der test.cpp in Zeile 107.</p>
<p>Wenn man nicht zu kurzen Code vor der If-Bedingung einfügt (z.B. ein &quot;cout &lt;&lt; i &lt;&lt; endl;&quot; oder auch die reinterpret-cast-Version der If-Bedingung), tritt der Bug nicht mehr auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399774</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 18 May 2014 18:43:04 GMT</pubDate></item></channel></rss>