<?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[ungenauigkeit bei float Berechnung]]></title><description><![CDATA[<p>Hallo,</p>
<p>bei mir geht es um eine ganz einfache Funktion. Zwei float Variablen (walkX, walkZ) werden in jedem Zeitschritt um walkVelocity (= 0.1) verringert. Desweiteren soll das ganze nur laufen wenn walkX oder walkZ ungleich null sind.<br />
Code:</p>
<pre><code>if ((walkX != 0) || (walkZ != 0)){ //as long as there is some way to walk
		if (walkX &gt; 0){
			walkX -= walkVelocity;
			position.x += walkVelocity;
		}
		if (walkX &lt; 0){
			walkX += walkVelocity;
			position.x -= walkVelocity;
		}
		if (walkZ &gt; 0){
			walkZ -= walkVelocity;
			position.z += walkVelocity;
		}
		if (walkZ &lt; 0){
			walkZ += walkVelocity;
			position.z -= walkVelocity;
		}
}
</code></pre>
<p>Lasse ich mir das ganze für eine Vairable ausgeben ergibt sich folgendes z.B. von 1.1 ausgehend:<br />
1.1<br />
1.0<br />
0.9000002<br />
0.8000002<br />
.<br />
.<br />
.<br />
1.56462e-006</p>
<p>Wieso wird das ganze nun nicht genau Null?</p>
<p>Vielleicht stehe ich ja auch komplett auf dem Schlauch, würde mich freuen wenn mir jemand helfen könnte.</p>
<p>viele Grüße</p>
<p>Smiffi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184432/ungenauigkeit-bei-float-berechnung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 18:04:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184432.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Jun 2007 08:36:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 08:36:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bei mir geht es um eine ganz einfache Funktion. Zwei float Variablen (walkX, walkZ) werden in jedem Zeitschritt um walkVelocity (= 0.1) verringert. Desweiteren soll das ganze nur laufen wenn walkX oder walkZ ungleich null sind.<br />
Code:</p>
<pre><code>if ((walkX != 0) || (walkZ != 0)){ //as long as there is some way to walk
		if (walkX &gt; 0){
			walkX -= walkVelocity;
			position.x += walkVelocity;
		}
		if (walkX &lt; 0){
			walkX += walkVelocity;
			position.x -= walkVelocity;
		}
		if (walkZ &gt; 0){
			walkZ -= walkVelocity;
			position.z += walkVelocity;
		}
		if (walkZ &lt; 0){
			walkZ += walkVelocity;
			position.z -= walkVelocity;
		}
}
</code></pre>
<p>Lasse ich mir das ganze für eine Vairable ausgeben ergibt sich folgendes z.B. von 1.1 ausgehend:<br />
1.1<br />
1.0<br />
0.9000002<br />
0.8000002<br />
.<br />
.<br />
.<br />
1.56462e-006</p>
<p>Wieso wird das ganze nun nicht genau Null?</p>
<p>Vielleicht stehe ich ja auch komplett auf dem Schlauch, würde mich freuen wenn mir jemand helfen könnte.</p>
<p>viele Grüße</p>
<p>Smiffi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306335</guid><dc:creator><![CDATA[Smiffi]]></dc:creator><pubDate>Fri, 15 Jun 2007 08:36:23 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 08:50:37 GMT]]></title><description><![CDATA[<p>Hi !</p>
<p>Initialisierung ?</p>
<p>walkX = 2**.6**;<br />
walkZ = 3**.0**;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306349</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Fri, 15 Jun 2007 08:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 08:55:06 GMT]]></title><description><![CDATA[<p>Ist technisch bedingt, mach am besten selbst 'ne Abfrage ob die Zahl in 'nem kleinen Bereich kleiner Null und größer Null ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306353</guid><dc:creator><![CDATA[Hazzel]]></dc:creator><pubDate>Fri, 15 Jun 2007 08:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 09:01:12 GMT]]></title><description><![CDATA[<p>Es ist so weil float/double keine GENAUE Speicherung einer reelen Zahl können sondern nur eine <strong>Aproximative</strong>.</p>
<p>Warum benutzt ihr eigendlich immer Datentypen ohne euch vorher mal darüber zu informieren? Es dauert genau 30 Sekunden um die Information ueber float im wiki zu finden:</p>
<p><a href="http://de.wikipedia.org/wiki/Gleitkommazahl" rel="nofollow">http://de.wikipedia.org/wiki/Gleitkommazahl</a></p>
<p>Aber lesen ist halt nicht mehr Jedermanns sache...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306359</guid><dc:creator><![CDATA[loks]]></dc:creator><pubDate>Fri, 15 Jun 2007 09:01:12 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 09:04:49 GMT]]></title><description><![CDATA[<p>Smiffi schrieb:</p>
<blockquote>
<p>Wieso wird das ganze nun nicht genau Null?</p>
</blockquote>
<p>weil nach der gängigen Art und Weise Fließkommazahlen binär darzustellen, der Wert 0,1 nur näherungsweise berechnet werden kann.</p>
<p>Die Lösung besteht in solchen Fällen darin, die Zeitschritte über eine Integer Variable zu zählen und die neue Zeit aus dem Integer zu berechnen. Etwa so</p>
<pre><code class="language-cpp">float walk = 2.0;
    int iZeitschritt = 0;
    // in der Schleife for( ; ; ++iZeitschritt ) Zeitschritte zählen
    float walkX = walk - iZeitschritt * 0.1;
</code></pre>
<p>Trotzdem ist nicht garantiert, dass eine Abfrage von walkX auf 0.0 irgendwann erfolgreich sein wird. Grundsätzlich sollte man keine float oder double mit == vergleichen, sondern nur über Toleranzen. In diesem Fall ist es vielleicht eher angebracht, die Anzahl der Zeitschritte vorher zu bestimmen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306361</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 15 Jun 2007 09:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 09:11:53 GMT]]></title><description><![CDATA[<p>loks schrieb:</p>
<blockquote>
<p>Aber lesen ist halt nicht mehr Jedermanns sache...</p>
</blockquote>
<p>man muss vorher ja erst drauf kommen, dass solch ein Problem überhaupt existiert. Der unbedarfte Anfänger tut das sicher nicht.<br />
Ich für meinen Teil habe mich auch noch nie darüber informiert, ob man beim Runterzählen einer positiven Integer Variablen immer irgendwann sicher bei 0 landet.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306362</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 15 Jun 2007 09:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 09:18:46 GMT]]></title><description><![CDATA[<p>loks schrieb:</p>
<blockquote>
<p>Es ist so weil float/double keine GENAUE Speicherung einer reelen Zahl können sondern nur eine <strong>Aproximative</strong>.</p>
<p>Warum benutzt ihr eigendlich immer Datentypen ohne euch vorher mal darüber zu informieren? Es dauert genau 30 Sekunden um die Information ueber float im wiki zu finden:</p>
<p><a href="http://de.wikipedia.org/wiki/Gleitkommazahl" rel="nofollow">http://de.wikipedia.org/wiki/Gleitkommazahl</a></p>
</blockquote>
<p>Und warum benutzt Du Worte (und setzt sie auch noch in fett) ohne Dich zuvor über deren Schreibweise zu informieren? -- Approximativ schreibt man mit zwei p. Das rauszufinden kostet einen doch höchstens 30 Sekunden.</p>
<blockquote>
<p>Aber lesen ist halt nicht mehr Jedermanns sache...</p>
</blockquote>
<p>SCNR <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306366</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 15 Jun 2007 09:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 09:28:51 GMT]]></title><description><![CDATA[<p>Genau, was im dezimalen 1/3 ist, ist im binären die 0.1 ist also ohne Rest nicht teilbar, deshalb landet man nicht bei Null.<br />
Wenn man für im binären teilbare Intervalle sorgt( 0.125, 0.0625 ) und dafür sorgt das walkX und walkZ ein Vielfaches davon sind, dann klappt das.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

int main()
{
	float walkVelocity = 0.125 ;

    float walkX = -20 * walkVelocity, walkZ = 30 * walkVelocity;

	while (( walkX != 0.0  )  || ( walkZ != 0.0 ))
	{
			if (walkX &gt; 0)  walkX -= walkVelocity;
            if (walkX &lt; 0)  walkX += walkVelocity;
		    if (walkZ &gt; 0)  walkZ -= walkVelocity;
            if (walkZ &lt; 0)  walkZ += walkVelocity;
			printf(&quot;\r %f %f&quot;, walkX, walkZ );
			Sleep(400);
    }

	return 0;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306367</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Fri, 15 Jun 2007 09:28:51 GMT</pubDate></item><item><title><![CDATA[Reply to ungenauigkeit bei float Berechnung on Fri, 15 Jun 2007 09:24:53 GMT]]></title><description><![CDATA[<p>Wie schon gesagt wurde ist es für einen Anfänger manchmal nicht so einfach, zu erkennen ob solche Probleme überhaupt existieren. Aber nun bin ich ja schlaucher <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>viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306372</guid><dc:creator><![CDATA[Smiffi]]></dc:creator><pubDate>Fri, 15 Jun 2007 09:24:53 GMT</pubDate></item></channel></rss>