<?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[floats richtig vergleichen]]></title><description><![CDATA[<p>Ich möchte in einem Funktionstemplate zwei Werte miteinander vergleichen. Die Funktion soll mit Integer- und Gleitkommazahlen gleichermaßen funktionieren.<br />
Nun frage ich mich, wann zwei Gleitkommazahlen &quot;gleich genug&quot; sind. Wie wähle ich ein vernünftiges Epsilon? Wie hilft mir <code>std::numeric_limits&lt;&gt;::epsilon()</code> weiter?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232404/floats-richtig-vergleichen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 06:42:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232404.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Jan 2009 14:24:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 14:24:08 GMT]]></title><description><![CDATA[<p>Ich möchte in einem Funktionstemplate zwei Werte miteinander vergleichen. Die Funktion soll mit Integer- und Gleitkommazahlen gleichermaßen funktionieren.<br />
Nun frage ich mich, wann zwei Gleitkommazahlen &quot;gleich genug&quot; sind. Wie wähle ich ein vernünftiges Epsilon? Wie hilft mir <code>std::numeric_limits&lt;&gt;::epsilon()</code> weiter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650240</guid><dc:creator><![CDATA[poc|off]]></dc:creator><pubDate>Thu, 22 Jan 2009 14:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 14:30:42 GMT]]></title><description><![CDATA[<p>poc|off schrieb:</p>
<blockquote>
<p>Nun frage ich mich, wann zwei Gleitkommazahlen &quot;gleich genug&quot; sind.</p>
</blockquote>
<p>Hier eignet sich eigentlich kein Template. Da das Epsilon idealerweise abhängig vom Fall (Der benötigten Genauigkeit) zu wählen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650245</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 22 Jan 2009 14:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 14:43:17 GMT]]></title><description><![CDATA[<p><code>std::numeric_limits&lt;&gt;::epsilon()</code> hilft dir da eigentlich nicht viel, da es nur die kleinste mögliche Inkrementierung von 1. angibt.</p>
<p>Wie asc sagte, kommt es drauf an, wie tolerant du sein kannst. Ich nehme an, du willst die Fliesskommazahlen zu einem bestimmten Zweck vergleichen - dann wirst du wahrscheinlich auch eine geeignete Genauigkeit finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650262</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 Jan 2009 14:43:17 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 15:04:08 GMT]]></title><description><![CDATA[<p>Es geht um Koordinaten, wobei ich vorher nicht weiß, wie groß das Koordinatensystem wird. Ein System erstreckt sich vielleicht von -1.0 bis +1.0, ein anderes von 0 bis 1e10. Die Toleranz soll von der Größe des Koordinatensystems abhängen: bei ersterem ist bspw. 0.001 ein gutes Epsilon, für das zweite vielleicht 0.5. Es soll natürlich so klein wie möglich sein und trotzdem die &quot;normalen&quot; Rundungsfehler ausmerzen.</p>
<p>Wie finde ich ein möglichst kleines Epsilon für einen bestimmten Zahlenbereich?<br />
Kann man denn irgendwie feststellen, ob die Differenz zweier Gleitkommazahlen größer ist als die kleinstmögliche Differenz zwischen beiden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650284</guid><dc:creator><![CDATA[poc|off]]></dc:creator><pubDate>Thu, 22 Jan 2009 15:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 15:07:14 GMT]]></title><description><![CDATA[<p>poc|off schrieb:</p>
<blockquote>
<p>Kann man denn irgendwie feststellen, ob die Differenz zweier Gleitkommazahlen größer ist als die kleinstmögliche Differenz zwischen beiden?</p>
</blockquote>
<p>Das ergibt irgendwie keinen Sinn, da sollte ich nochmal drüber nachdenken.:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650285</guid><dc:creator><![CDATA[poc|off]]></dc:creator><pubDate>Thu, 22 Jan 2009 15:07:14 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 16:01:36 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p><code>std::numeric_limits&lt;&gt;::epsilon()</code> hilft dir da eigentlich nicht viel, da es nur die kleinste mögliche Inkrementierung von 1. angibt.</p>
</blockquote>
<p>Und gibt es eine Möglichkeit, die kleinste mögliche Inkrementierung einer beliebigen Gleitkommazahl zu bestimmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650345</guid><dc:creator><![CDATA[poc|off]]></dc:creator><pubDate>Thu, 22 Jan 2009 16:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 16:45:52 GMT]]></title><description><![CDATA[<p>Gleitkommazahlen fragt man auf Gleichheit immer auf den Absultwert (fabs) der Differenz der beiden Werte auf kleiner eines Toleranzwertes (z.B. eps=0.1e-5) ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650363</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Thu, 22 Jan 2009 16:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 16:29:26 GMT]]></title><description><![CDATA[<p>nimm halt:</p>
<pre><code class="language-cpp">const float dein_toleranzwert_fuer_1x1 = 0.00001f;

bool IsSame (float a, float b, float coord_x, float coord_y)
{
 a -= b;
 b = dein_toleranzwert_fuer_1x1 * sqrt(coord_x * coord_y);
 if (a &lt; 0)
     return a &gt;= -b;
 return a &lt;= b;
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650368</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 22 Jan 2009 16:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 16:40:22 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>nimm halt:</p>
<pre><code class="language-cpp">const float dein_toleranzwert_fuer_1x1 = 0.00001f;
[...]
</code></pre>
</blockquote>
<p>Ich verstehe die Intention dahinter, aber wie kommst du auf die 0.00001?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650375</guid><dc:creator><![CDATA[poc|off]]></dc:creator><pubDate>Thu, 22 Jan 2009 16:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 17:50:13 GMT]]></title><description><![CDATA[<p>ich würde das als templatze machen:</p>
<pre><code class="language-cpp">template&lt;T&gt;
static T getTolerance( T dummy )
{
  return T(0);
}
</code></pre>
<p>und dann ein paar spezialisierungen anlegen:</p>
<pre><code class="language-cpp">template&lt;&gt;
static double getTolerance( double dummy )
{
  return .000001;
}

template&lt;&gt;
static float getTolerance( float dummy )
{
  return .0001f;
}
</code></pre>
<p>bin mir grad nicht sicher, ob die syntayx bei den spezialisierungen korrekt sind, aber ihr wisst was gemeint ist.</p>
<p>Eventuell kann man das epsilon auch abhängigmachen, von der größe von dummy, da ja die genauigkeit bei großen zahlen abnimmt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650413</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Thu, 22 Jan 2009 17:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 18:01:07 GMT]]></title><description><![CDATA[<p>berniebutt schrieb:</p>
<blockquote>
<p>Gleitkommazahlen fragt man auf Gleichheit immer auf den Absultwert (fabs) der Differenz der beiden Werte auf kleiner eines Toleranzwertes (z.B. eps=0.1e-5) ab.</p>
</blockquote>
<p>Na hoffentlich nicht.<br />
<a href="http://c-faq.com/fp/fpequal.html" rel="nofollow">http://c-faq.com/fp/fpequal.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650422</guid><dc:creator><![CDATA[unräg]]></dc:creator><pubDate>Thu, 22 Jan 2009 18:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 18:07:48 GMT]]></title><description><![CDATA[<p>Beachten muss man auch noch den Fall, dass die zwei Achsen unterschiedliche Auflösungen haben und man je nach Achse verschiedene Epsilons braucht. Evtl kann man den Vergleich auch an das Koordinatensystem oder die Achsen weiter-dirigieren, um nicht jedesmal die Auflösung übergeben zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650429</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 22 Jan 2009 18:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Thu, 22 Jan 2009 18:49:13 GMT]]></title><description><![CDATA[<p>Habe etwas gefunden: <a href="http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm#_Toc135149455" rel="nofollow">http://www.cygnus-software.com/papers/comparingfloats/Comparing floating point numbers.htm#_Toc135149455</a><br />
Das scheint zu tun, was ich will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650456</guid><dc:creator><![CDATA[poc|off]]></dc:creator><pubDate>Thu, 22 Jan 2009 18:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Sun, 25 Jan 2009 16:20:04 GMT]]></title><description><![CDATA[<p>unräg schrieb:</p>
<blockquote>
<p>berniebutt schrieb:</p>
<blockquote>
<p>Gleitkommazahlen fragt man auf Gleichheit immer auf den Absultwert (fabs) der Differenz der beiden Werte auf kleiner eines Toleranzwertes (z.B. eps=0.1e-5) ab.</p>
</blockquote>
<p>Na hoffentlich nicht.<br />
<a href="http://c-faq.com/fp/fpequal.html" rel="nofollow">http://c-faq.com/fp/fpequal.html</a></p>
</blockquote>
<pre><code class="language-cpp">double d1=7.500000002;
double d2=15.00000002;
double dx;
double eps=1.e-6;
int    gleich;

dx=fabsl(d1-d2/2.0);
if(dx &lt; eps) gleich=TRUE;
  else       gleich=FALSE;
</code></pre>
<p>Was soll an dieser alt bewährten Vorgehensweise zum Prüfen zweier Gleitkommanzahlen auf Gleichheit etwas anders oder besser gemacht werden? So jedenfalls geht es klar und übersichtlich für alle Compiler und ist eine gängige Praxis, vor allem bei Iterationen. Der WEB-Hinweis sagt auch nichts anderes!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652093</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Sun, 25 Jan 2009 16:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to floats richtig vergleichen on Sun, 25 Jan 2009 18:05:12 GMT]]></title><description><![CDATA[<p>berniebutt schrieb:</p>
<blockquote>
<p>Was soll an dieser alt bewährten Vorgehensweise zum Prüfen zweier Gleitkommanzahlen auf Gleichheit etwas anders oder besser gemacht werden?</p>
</blockquote>
<p>Das Problem kommt dann, wenn du mit sehr großen oder sehr kleinen Zahlen operierst. Wenn du auf Zahlen bei 1.e-7 opererierst, sind sie nach dem &quot;Standard-Algorithmus&quot; immer gleich - was ja wohl kaum gewollt sein kann. Und bei sehr großen Zahlen hast du praktisch nie &quot;Gleichheit&quot;, auch wenn es eigentlich so sein sollte. Deshalb ist die Lösung aus dem cygnus-software-Link so interessant, weil es die Problematik eben löst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652172</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 25 Jan 2009 18:05:12 GMT</pubDate></item></channel></rss>