<?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[Problem mit Float-Ungenauigkeit.]]></title><description><![CDATA[<p>Ich habe ein Klasse welche diese Eigenschaft besitzt:</p>
<pre><code class="language-cpp">class TglObject
{
	protected:
	    GLfloat color[3];

	public:
	    GLfloat* getColor() const {return (GLfloat*)color;};
};
</code></pre>
<p>Im Array ist folgender Wert gespeichert (0.9,0.9,0.9)</p>
<p>In einer Funktion mache ich nun folgendes:</p>
<pre><code class="language-cpp">GLfloat col;

	col = edit-&gt;getColor()[0];

	if (col == 0.9)
		edit-&gt;setColor(0.5,0.5,0.9);
	else edit-&gt;setColor(0.9,0.9,0.9);
</code></pre>
<p>Es wird immer nur der else-Zweig betreten, weil col nicht 0.9 sondern 0.89999999 enthält. Wieso? Es wurden überall doch dieselben Typen verwendet.</p>
<p>(GLfloat ist ein float.)</p>
<p>Was muss ich machen, ob sowas zu vermeiden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/133531/problem-mit-float-ungenauigkeit</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 22:57:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/133531.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Jan 2006 15:39:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:39:33 GMT]]></title><description><![CDATA[<p>Ich habe ein Klasse welche diese Eigenschaft besitzt:</p>
<pre><code class="language-cpp">class TglObject
{
	protected:
	    GLfloat color[3];

	public:
	    GLfloat* getColor() const {return (GLfloat*)color;};
};
</code></pre>
<p>Im Array ist folgender Wert gespeichert (0.9,0.9,0.9)</p>
<p>In einer Funktion mache ich nun folgendes:</p>
<pre><code class="language-cpp">GLfloat col;

	col = edit-&gt;getColor()[0];

	if (col == 0.9)
		edit-&gt;setColor(0.5,0.5,0.9);
	else edit-&gt;setColor(0.9,0.9,0.9);
</code></pre>
<p>Es wird immer nur der else-Zweig betreten, weil col nicht 0.9 sondern 0.89999999 enthält. Wieso? Es wurden überall doch dieselben Typen verwendet.</p>
<p>(GLfloat ist ein float.)</p>
<p>Was muss ich machen, ob sowas zu vermeiden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969844</guid><dc:creator><![CDATA[Anfänger06]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:43:09 GMT]]></title><description><![CDATA[<p>Anfänger06 schrieb:</p>
<blockquote>
<p>Es wird immer nur der else-Zweig betreten, weil col nicht 0.9 sondern 0.89999999 enthält. Wieso?</p>
</blockquote>
<p>Weil man Zahlen, die man Dezimal endlich darstellen kann, binär nicht zwangsläufig ebenfalls endlich darstellen kann.</p>
<blockquote>
<p>Was muss ich machen, ob sowas zu vermeiden?</p>
</blockquote>
<p>Siehe dazu auch hier: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-133410.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-133410.html</a></p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969849</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:43:59 GMT]]></title><description><![CDATA[<p>du kannst floats nicht einfach auf gleichheit prüfen, eben weil sie nicht 1:1 abgespeichert werden können, was du schon festgestellt hast.<br />
also am besten eine art toleranz festlegen:</p>
<pre><code class="language-cpp">float toleranz = 0.001f;
if(col &lt; 0.9f + toleranz &amp;&amp; col &gt; 0.9f - toleranz)
  //...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/969851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969851</guid><dc:creator><![CDATA[cin]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:44:38 GMT]]></title><description><![CDATA[<p>Noch was: Auch setColor() erwartet GLfloats. D.h. überall wird nur mit floats gearbeitet. Nirgendwo tauchen double auf. Solche fehler sind doch aber fehler die beim konvertieren von float zu double passieren, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969853</guid><dc:creator><![CDATA[Anfänger06]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:48:21 GMT]]></title><description><![CDATA[<p>float kann einen Wert nicht exakt speichern, deshalb verwendet er die jeweils nächstgelegene Zahl, die er speichern kann - und deshalb sind Vergleiche in float auch nicht besonders exakt.</p>
<p>Als Lösung kann ich dir nur anbieten, näherungsweise zu vergleichen:</p>
<pre><code class="language-cpp">const float EPSILON = 1e-5f;
...

if(fabs(col-0.9)&lt;EPSILON)
{
  // col ist ungefähr 0.9 -&gt; rechne damit weiter
}
else
{
  ...
}
</code></pre>
<p>Edit: Mist - ich werde wohl alt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969856</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:48:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:47:43 GMT]]></title><description><![CDATA[<p>Anfänger06 schrieb:</p>
<blockquote>
<p>Noch was: Auch setColor() erwartet GLfloats. D.h. überall wird nur mit floats gearbeitet. Nirgendwo tauchen double auf. Solche fehler sind doch aber fehler die beim konvertieren von float zu double passieren, oder?</p>
</blockquote>
<p>nicht zwangsläufig. fließkommazahlen werden nicht wie gewohnt dezimal abgespeichert, sondern so: <a href="http://de.wikipedia.org/wiki/Flie%C3%9Fkomma-Zahlen" rel="nofollow">http://de.wikipedia.org/wiki/Flie%C3%9Fkomma-Zahlen</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/969858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969858</guid><dc:creator><![CDATA[cin]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Float-Ungenauigkeit. on Wed, 18 Jan 2006 15:47:58 GMT]]></title><description><![CDATA[<p>Anfänger06 schrieb:</p>
<blockquote>
<p>Noch was: Auch setColor() erwartet GLfloats. D.h. überall wird nur mit floats gearbeitet. Nirgendwo tauchen double auf. Solche fehler sind doch aber fehler die beim konvertieren von float zu double passieren, oder?</p>
</blockquote>
<p>Nein, die Fehler tauchen überall auf, wo du mit Gleitkommazahlen arbeitest - egal ob float, double oder irgendwas anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969859</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 18 Jan 2006 15:47:58 GMT</pubDate></item></channel></rss>