<?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[Unterschiedliches ergebnis für float und double]]></title><description><![CDATA[<p>Hallo,<br />
warum ist das Ergebnis von folgenden Funktionen für floats nicht gleich? Bei Double ist es aber gleich</p>
<p>Ich benutze gcc 3.4.2 (gnauergesagt mingw). Fall es wichtig ist.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T calc1(T a, T b, T c)
{
   T t = a*a + b*b + c*c;
   t = std::sqrt(t); //&lt;-- Hier ist der Unterschied
   a /= t; //&lt;-- Hier ist der Unterschied
   b /= t; //&lt;-- Hier ist der Unterschied
   c /= t; //&lt;-- Hier ist der Unterschied
   return a + b + c;
}

template &lt;typename T&gt;
T calc2(T a, T b, T c)
{
   T t = a*a + b*b + c*c;
   t = (T)1.0/std::sqrt(t);  //&lt;-- Hier ist der Unterschied
   a *= t; //&lt;-- Hier ist der Unterschied
   b *= t; //&lt;-- Hier ist der Unterschied
   c *= t; //&lt;-- Hier ist der Unterschied
   return a + b + c;
}
</code></pre>
<p>Wenn ich dann aufrufe:</p>
<pre><code class="language-cpp">bool res = // res ist hier 0
calc1&lt;float&gt;(2.0f, 3.0f, -5.0f) == calc2&lt;float&gt;(2.0f, 3.0f, -5.0f);
res = // res ist hier 1
calc1&lt;double&gt;(2.0f, 3.0f, -5.0f) == calc2&lt;double&gt;(2.0f, 3.0f, -5.0f);
</code></pre>
<p>Die calc2&lt;float&gt;() liefert offensichtlich ein falsches Ergebnis. Aber warum? 1.0 /sqrt(t) ist nicht besonders klein. Ca 0.162.<br />
Leider ist aber gerade dieser Algorithmus den ich haben möchte. Da, eine Division und drei multiplikationen imho schneller sind als drei divisionen.</p>
<p>Oder sollte ich komplett auf double umsteigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/138834/unterschiedliches-ergebnis-für-float-und-double</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 07:15:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/138834.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Mar 2006 17:54:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschiedliches ergebnis für float und double on Wed, 01 Mar 2006 17:54:49 GMT]]></title><description><![CDATA[<p>Hallo,<br />
warum ist das Ergebnis von folgenden Funktionen für floats nicht gleich? Bei Double ist es aber gleich</p>
<p>Ich benutze gcc 3.4.2 (gnauergesagt mingw). Fall es wichtig ist.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T calc1(T a, T b, T c)
{
   T t = a*a + b*b + c*c;
   t = std::sqrt(t); //&lt;-- Hier ist der Unterschied
   a /= t; //&lt;-- Hier ist der Unterschied
   b /= t; //&lt;-- Hier ist der Unterschied
   c /= t; //&lt;-- Hier ist der Unterschied
   return a + b + c;
}

template &lt;typename T&gt;
T calc2(T a, T b, T c)
{
   T t = a*a + b*b + c*c;
   t = (T)1.0/std::sqrt(t);  //&lt;-- Hier ist der Unterschied
   a *= t; //&lt;-- Hier ist der Unterschied
   b *= t; //&lt;-- Hier ist der Unterschied
   c *= t; //&lt;-- Hier ist der Unterschied
   return a + b + c;
}
</code></pre>
<p>Wenn ich dann aufrufe:</p>
<pre><code class="language-cpp">bool res = // res ist hier 0
calc1&lt;float&gt;(2.0f, 3.0f, -5.0f) == calc2&lt;float&gt;(2.0f, 3.0f, -5.0f);
res = // res ist hier 1
calc1&lt;double&gt;(2.0f, 3.0f, -5.0f) == calc2&lt;double&gt;(2.0f, 3.0f, -5.0f);
</code></pre>
<p>Die calc2&lt;float&gt;() liefert offensichtlich ein falsches Ergebnis. Aber warum? 1.0 /sqrt(t) ist nicht besonders klein. Ca 0.162.<br />
Leider ist aber gerade dieser Algorithmus den ich haben möchte. Da, eine Division und drei multiplikationen imho schneller sind als drei divisionen.</p>
<p>Oder sollte ich komplett auf double umsteigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1006113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1006113</guid><dc:creator><![CDATA[zocker]]></dc:creator><pubDate>Wed, 01 Mar 2006 17:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliches ergebnis für float und double on Wed, 01 Mar 2006 18:52:01 GMT]]></title><description><![CDATA[<p>du darfst fließkommazahlen nicht vergleichen. das sind immer nur gerundete werte, da sehr viele zahlen nicht exakt darstellbar sind.</p>
<p>besser wäre:</p>
<pre><code class="language-cpp">calc1&lt;float&gt;(2.0f, 3.0f, -5.0f) - calc2&lt;float&gt;(2.0f, 3.0f, -5.0f) &lt;= 0.001f
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1006149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1006149</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 01 Mar 2006 18:52:01 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliches ergebnis für float und double on Thu, 02 Mar 2006 18:42:15 GMT]]></title><description><![CDATA[<p>Dieser Ansatz würde zwar funktionieren. Aber die Ungenauigkeit ist immer noch vorhanden. Und sie ist nicht gerade klein.</p>
<p>Ich weiß dass man nicht in einem frühen Stadium auf schnellen Code achten sollte. Aber (1) Es wird eine Lib. D.h. ich kann jetzt nicht abschätzen wie oft so ein Vergleich stattfindet. Und (2) mit deiner Methode wäre das doch um einiges langsamer. V.a. wenn man berücksichtigt, dass die Differenz auch negativ sein kann.</p>
<p>Wenn es keine andere Möglichkeit gibt, dann bleibt mir wohl nichts anderes übrig als so einen Mindestwert (Epsilon?) zu verwenden.</p>
<p>Oder soll ich double verwenden, obwohl die Abweichung für float nur ca. 3e-8 beträgt. Oder ist das anwendungsspeziefisch und ich sollte lieber ein Template anbieten und für &quot;spezielle&quot; Anforderungen einen 1Mb-großen Datentyp implementieren <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1007045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1007045</guid><dc:creator><![CDATA[zocker]]></dc:creator><pubDate>Thu, 02 Mar 2006 18:42:15 GMT</pubDate></item></channel></rss>