<?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[cast verursacht Zahlenschwund]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>Aufgabe war es eine Funktion zu erstellen welche Quersummen einer Ganzzahl ermittelt.<br />
Die Aufgabe wurde soweit gelöst, nur sitzen wir schon einige Zeit an einer Version eines Kollegen<br />
die die ganze Berechnung ein wenig umständlicher löst.(Das komplette Programm mit passender Ausgabe hänge ich noch mal hinten dran.)</p>
<p>Ein Großteil der Zahlen wird richtig gerechnet, eine Außnahme stellt aber die 5555 dar.</p>
<p>Das Problem liegt hierbei in der letzten Schleife der Funktion qsum().</p>
<pre><code>for (z;z&gt;0;z--)   //multipliziert die Zahl in jedem Durchlauf mit 10 und
    {                 //zieht davon den integer ab.
        t++;          //Beispiel: Die Zahl steht bei 9.9184, so werden 9 
                      //abgezogen und die Zahl wird auf 0.9184 gesetzt.

        cout&lt;&lt;&quot;+++++&quot;&lt;&lt;t&lt;&lt;&quot;. Durchlauf: +++++\n\n&quot;;
        b=b*10;
	cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;
        c=(b); 		  //c= integer von b
	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;

        a=a+c;
        cout&lt;&lt;a&lt;&lt;&quot;=a\n\n&quot;;

        b=b-c;  	   //integer von b abziehen, siehe Beispiel oben
        cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

		c=0;

    }
</code></pre>
<p>Im 4. Durchlauf der Ausgabe wird aus unerfindlichen Gründen der vorher korrekt angezeigte Wert (-&gt; b) während der Zuweisung verschluckt (-&gt; c).</p>
<pre><code>+++++4. Durchlauf: +++++

5=b      //

0=c

4=c      //

19=a

1=b

Ergebnis: 19
</code></pre>
<p>Aber als Ursache vermuten wir<br />
den cast.</p>
<pre><code>c=(b); 		  //c= integer von b
</code></pre>
<p>Als Lösung hatten wir schon mehrere Varianten der Cast's in betracht gezogen ( int(b), static_cast&lt;int&gt;(b) ), sowie ein<br />
Aufrunden des Wertes. Aber Erfolg hatten wir damit nicht.</p>
<p>Vielleicht hat noch jemand eine Idee wie wir an die Sache rangehen können bzw welches Phänomen hinter diesem Problem steckt.</p>
<p>Danke schon mal für die Aufmerksamkeit.<br />
Gruß</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;math.h&gt;

using namespace std;

//Deklaration
int qsum (int);

//Hauptprogramm
int main ()
{
    int a;
    cout&lt;&lt;&quot;Zahl, deren Quersumme berechnet werden soll: &quot;;cin&gt;&gt;a;
    cout&lt;&lt;&quot;Ergebnis: &quot;&lt;&lt;qsum (a);
    getch ();
    return 0;   
}

//Definiton
int qsum (int a)
{
    double b;
    int z=1,c,t=0;
    b=a;

    while (a&gt;9) 	  //Schleife ermittelt Anzahl der Stellen
    {
          a=a/10;
          z++; 		  //Eingegebene Zahl hat z-Stellen
    }

    a=0; 	      //a= Zähler der Quersumme, t= Schleifenzähler, b= eingegebene Zahl 
    b=b/(pow(10,z));  //bringt die Zahl auf 0.xxxxx....

    for (z;z&gt;0;z--)   //multipliziert die Zahl in jedem Durchlauf mit 10 und
    {                 //zieht davon den integer ab.
        t++;          //Beispiel: Die Zahl steht bei 9.9184, so werden 9 
                      //abgezogen und die Zahl wird auf 0.9184 gesetzt.

        cout&lt;&lt;&quot;+++++&quot;&lt;&lt;t&lt;&lt;&quot;. Durchlauf: +++++\n\n&quot;;
        b=b*10;
	cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;
        c=(b); 		  //c= integer von b
	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;

        a=a+c;
        cout&lt;&lt;a&lt;&lt;&quot;=a\n\n&quot;;

        b=b-c;  	   //integer von b abziehen, siehe Beispiel oben
        cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

		c=0;

    }   
    return a;
}
</code></pre>
<pre><code>Zahl, deren Quersumme berechnet werden soll: 5555
+++++1. Durchlauf: +++++

5.555=b

2293576=c

5=c

5=a

0.555=b

+++++2. Durchlauf: +++++

5.55=b

0=c

5=c

10=a

0.55=b

+++++3. Durchlauf: +++++

5.5=b

0=c

5=c

15=a

0.5=b

+++++4. Durchlauf: +++++

5=b

0=c

4=c

19=a

1=b

Ergebnis: 19
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/237315/cast-verursacht-zahlenschwund</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 13:45:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237315.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Mar 2009 07:26:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to cast verursacht Zahlenschwund on Fri, 27 Mar 2009 07:26:56 GMT]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>Aufgabe war es eine Funktion zu erstellen welche Quersummen einer Ganzzahl ermittelt.<br />
Die Aufgabe wurde soweit gelöst, nur sitzen wir schon einige Zeit an einer Version eines Kollegen<br />
die die ganze Berechnung ein wenig umständlicher löst.(Das komplette Programm mit passender Ausgabe hänge ich noch mal hinten dran.)</p>
<p>Ein Großteil der Zahlen wird richtig gerechnet, eine Außnahme stellt aber die 5555 dar.</p>
<p>Das Problem liegt hierbei in der letzten Schleife der Funktion qsum().</p>
<pre><code>for (z;z&gt;0;z--)   //multipliziert die Zahl in jedem Durchlauf mit 10 und
    {                 //zieht davon den integer ab.
        t++;          //Beispiel: Die Zahl steht bei 9.9184, so werden 9 
                      //abgezogen und die Zahl wird auf 0.9184 gesetzt.

        cout&lt;&lt;&quot;+++++&quot;&lt;&lt;t&lt;&lt;&quot;. Durchlauf: +++++\n\n&quot;;
        b=b*10;
	cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;
        c=(b); 		  //c= integer von b
	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;

        a=a+c;
        cout&lt;&lt;a&lt;&lt;&quot;=a\n\n&quot;;

        b=b-c;  	   //integer von b abziehen, siehe Beispiel oben
        cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

		c=0;

    }
</code></pre>
<p>Im 4. Durchlauf der Ausgabe wird aus unerfindlichen Gründen der vorher korrekt angezeigte Wert (-&gt; b) während der Zuweisung verschluckt (-&gt; c).</p>
<pre><code>+++++4. Durchlauf: +++++

5=b      //

0=c

4=c      //

19=a

1=b

Ergebnis: 19
</code></pre>
<p>Aber als Ursache vermuten wir<br />
den cast.</p>
<pre><code>c=(b); 		  //c= integer von b
</code></pre>
<p>Als Lösung hatten wir schon mehrere Varianten der Cast's in betracht gezogen ( int(b), static_cast&lt;int&gt;(b) ), sowie ein<br />
Aufrunden des Wertes. Aber Erfolg hatten wir damit nicht.</p>
<p>Vielleicht hat noch jemand eine Idee wie wir an die Sache rangehen können bzw welches Phänomen hinter diesem Problem steckt.</p>
<p>Danke schon mal für die Aufmerksamkeit.<br />
Gruß</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;math.h&gt;

using namespace std;

//Deklaration
int qsum (int);

//Hauptprogramm
int main ()
{
    int a;
    cout&lt;&lt;&quot;Zahl, deren Quersumme berechnet werden soll: &quot;;cin&gt;&gt;a;
    cout&lt;&lt;&quot;Ergebnis: &quot;&lt;&lt;qsum (a);
    getch ();
    return 0;   
}

//Definiton
int qsum (int a)
{
    double b;
    int z=1,c,t=0;
    b=a;

    while (a&gt;9) 	  //Schleife ermittelt Anzahl der Stellen
    {
          a=a/10;
          z++; 		  //Eingegebene Zahl hat z-Stellen
    }

    a=0; 	      //a= Zähler der Quersumme, t= Schleifenzähler, b= eingegebene Zahl 
    b=b/(pow(10,z));  //bringt die Zahl auf 0.xxxxx....

    for (z;z&gt;0;z--)   //multipliziert die Zahl in jedem Durchlauf mit 10 und
    {                 //zieht davon den integer ab.
        t++;          //Beispiel: Die Zahl steht bei 9.9184, so werden 9 
                      //abgezogen und die Zahl wird auf 0.9184 gesetzt.

        cout&lt;&lt;&quot;+++++&quot;&lt;&lt;t&lt;&lt;&quot;. Durchlauf: +++++\n\n&quot;;
        b=b*10;
	cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;
        c=(b); 		  //c= integer von b
	cout&lt;&lt;c&lt;&lt;&quot;=c\n\n&quot;;

        a=a+c;
        cout&lt;&lt;a&lt;&lt;&quot;=a\n\n&quot;;

        b=b-c;  	   //integer von b abziehen, siehe Beispiel oben
        cout&lt;&lt;b&lt;&lt;&quot;=b\n\n&quot;;

		c=0;

    }   
    return a;
}
</code></pre>
<pre><code>Zahl, deren Quersumme berechnet werden soll: 5555
+++++1. Durchlauf: +++++

5.555=b

2293576=c

5=c

5=a

0.555=b

+++++2. Durchlauf: +++++

5.55=b

0=c

5=c

10=a

0.55=b

+++++3. Durchlauf: +++++

5.5=b

0=c

5=c

15=a

0.5=b

+++++4. Durchlauf: +++++

5=b

0=c

4=c

19=a

1=b

Ergebnis: 19
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1686752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686752</guid><dc:creator><![CDATA[thequh]]></dc:creator><pubDate>Fri, 27 Mar 2009 07:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to cast verursacht Zahlenschwund on Fri, 27 Mar 2009 08:49:59 GMT]]></title><description><![CDATA[<p>Sieht so aus als würde ein interner Rundungsfehler auftreten.</p>
<pre><code class="language-cpp">b=b/(pow(10,z));
</code></pre>
<p>5555 / 10 ^ 4 sollte 0,5555 sein<br />
scheinbar macht er aber<br />
0,55549999999999999999<br />
daraus</p>
<p>cout rundet das intern selber (oder erkennt den Fehler und berichtigt ihn) -&gt; somit sieht man es 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="😉"
    /></p>
<p>Im vierten Durchlauf geschieht dann aber folgendes:</p>
<pre><code class="language-cpp">c = (b);  // von double 4,9999999 nach int = 4
</code></pre>
<pre><code class="language-cpp">c = Round (b)  // hier richtige Rundungsfunktion einsetzen ;)
</code></pre>
<p>sollte das Problem beheben.</p>
<p>Keros</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686789</guid><dc:creator><![CDATA[Keros]]></dc:creator><pubDate>Fri, 27 Mar 2009 08:49:59 GMT</pubDate></item></channel></rss>