<?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[Was soll ich da zurückgeben?]]></title><description><![CDATA[<pre><code class="language-cpp">#include &quot;ratNum.h&quot;
#include &lt;math.h&gt;

static long fraction_error = 0L;

/* Sinn und Zweck: sollte den ggT berechnen (Hoffentlich! Da lass ich mich
noch ueberraschen ... */
long gcd(long op1, long op2){
	long temp1 = op1 = abs(op1);
	op2 = abs(op2);
	if(op2 &gt; temp1){
		op1 = op2;
		op2 = temp1;
	}

	if(op1){
		if(op2){
			while(temp1 = op1 - op2){
				if(op2 % temp1){
					op1 = temp1 &gt; op2 ? temp1 : op2;
					if(temp1 &lt; op2)
						op2 = temp1;
				}
				else
					return op2;
			}
			return op2;
		}
		else
			return op1;
	}
	fraction_error |= DIV_ZERO;
	return 1L; 
/* -----&gt;  Hier bin ich ratlos. Wenn der Aufrufer zwei Nullen reinsteckt (z.B.
--- weil ein Bruch gekuerzt werden soll), hat er also anschließend vor, durch
--- den Rueckgabewert zu dividieren. Es ist doch nicht ueblich, dass man es
--- dem Aufrufer zumutet, staendig nachzupruefen, ob irgendwo eine Division
--- durch Null passieren koennte. Kann man das so lassen, dass man also einfach
--- 1 zurueckgibt, auch wenn 1 nicht unbedingt der ggT von zwei Nullen ist.
--- Als Ausweg ist mir nur noch eingefallen, eine globale Variable zu
--- verwenden, die in so einem Fall auf TRUE gesetzt wird, damit sich der
--- Aufrufer letzten Endes auch vergewissern kann, dass waehrend des Rechnens
--- kein Fehler aufgetreten ist. Stichwort: Fehlerbehandlung, wenn man nicht
--- vorhersehen kann, welche Parameter in die Funktion reingesteckt werden.
--- Wie wuerdet Ihr dem Problem vorbeugen ?
--- Bin dankbar fuer jeden Tipp.*/
}
</code></pre>
<p>Herauskommen sollte letzten Endes eine Art Mini-Lib, mit der man so halbwegs in <strong>Q</strong> rechnen kann.<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215151/was-soll-ich-da-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 19:16:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215151.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Jun 2008 20:14:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Fri, 06 Jun 2008 20:14:28 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &quot;ratNum.h&quot;
#include &lt;math.h&gt;

static long fraction_error = 0L;

/* Sinn und Zweck: sollte den ggT berechnen (Hoffentlich! Da lass ich mich
noch ueberraschen ... */
long gcd(long op1, long op2){
	long temp1 = op1 = abs(op1);
	op2 = abs(op2);
	if(op2 &gt; temp1){
		op1 = op2;
		op2 = temp1;
	}

	if(op1){
		if(op2){
			while(temp1 = op1 - op2){
				if(op2 % temp1){
					op1 = temp1 &gt; op2 ? temp1 : op2;
					if(temp1 &lt; op2)
						op2 = temp1;
				}
				else
					return op2;
			}
			return op2;
		}
		else
			return op1;
	}
	fraction_error |= DIV_ZERO;
	return 1L; 
/* -----&gt;  Hier bin ich ratlos. Wenn der Aufrufer zwei Nullen reinsteckt (z.B.
--- weil ein Bruch gekuerzt werden soll), hat er also anschließend vor, durch
--- den Rueckgabewert zu dividieren. Es ist doch nicht ueblich, dass man es
--- dem Aufrufer zumutet, staendig nachzupruefen, ob irgendwo eine Division
--- durch Null passieren koennte. Kann man das so lassen, dass man also einfach
--- 1 zurueckgibt, auch wenn 1 nicht unbedingt der ggT von zwei Nullen ist.
--- Als Ausweg ist mir nur noch eingefallen, eine globale Variable zu
--- verwenden, die in so einem Fall auf TRUE gesetzt wird, damit sich der
--- Aufrufer letzten Endes auch vergewissern kann, dass waehrend des Rechnens
--- kein Fehler aufgetreten ist. Stichwort: Fehlerbehandlung, wenn man nicht
--- vorhersehen kann, welche Parameter in die Funktion reingesteckt werden.
--- Wie wuerdet Ihr dem Problem vorbeugen ?
--- Bin dankbar fuer jeden Tipp.*/
}
</code></pre>
<p>Herauskommen sollte letzten Endes eine Art Mini-Lib, mit der man so halbwegs in <strong>Q</strong> rechnen kann.<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1524353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1524353</guid><dc:creator><![CDATA[Metatron]]></dc:creator><pubDate>Fri, 06 Jun 2008 20:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Fri, 06 Jun 2008 20:27:56 GMT]]></title><description><![CDATA[<p>Versuch es doch mit Exception-Handling. Alternativ könntest du auch je nach Fehler negative Werte zurückgeben lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1524371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1524371</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 06 Jun 2008 20:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Fri, 06 Jun 2008 21:12:36 GMT]]></title><description><![CDATA[<p>Im Kontext des Kürzen von Brüchens kann der Fall, dass beide Operanden 0 sind, eigentlich gar nicht auftreten (dann wäre der Bruch vorher schon undefiniert) - insofern dürfte eine Fehlerbehandlung an dieser Stelle nicht zwingend erforderlich sein. Abgesehen davon liefert die übliche rekursive Form des euklidische Algorithmus</p>
<pre><code class="language-cpp">long ggt(long a, long b) {
    return b != 0 ? ggt( b, a % b ) : a;
}
</code></pre>
<p>hier bereits das brauchbare Ergebnis 0. Da es von vornherein ein Fehler des Aufrufers ist, kann er sich auch mit diesem Ergebnis auseinandersetzen. Die Fälle, wenn nur ein Argument 0 ist, benötigen dagegen ohnehin keine Sonderbehandlung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1524390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1524390</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 06 Jun 2008 21:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Sun, 08 Jun 2008 11:59:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int smaller(const Fraction* op1, const Fraction* op2){
 /*
 if(op1-&gt;num &gt; 65000 &amp;&amp; op2-&gt;den &gt; 65000 ||
    op1-&gt;num &lt; -65000 &amp;&amp; op2-&gt;den &gt; 65000)
   fraction_error |= OVERFLOW;
 */

 return op1 &amp;&amp; op2 ?
 op1-&gt;num*op2-&gt;den &lt; op2-&gt;num*op1-&gt;den :
 0;
}
</code></pre>
<p>Ein ähnliches Problem ist jetzt hier eingetreten, wo der erste Operand darauf überprüft werden soll, ob er kleiner als der zweite ist.<br />
Und zwar ist sehr schwer vorherzusehen, ob z.B. möglicherweise<br />
op1-&gt;num * op2-&gt;den den zulässigen Wertebereich für long über- oder unterschreitet, und als Folge davon ein falsches Ergebnis zurückgeliefert wird.</p>
<p>Das, was ich jetzt erstmal auskommentiert habe, deckt immer noch nicht alle Fälle ab, in denen ein zu großer oder zu kleiner Wert für den Datentyp long herauskommen könnte, weil z.B. auch wenn nicht beide Bedingungen erfüllt sind, also z.B. 100000 mal 30000 gerechnet werden müsste, könnte trotzdem noch ein Overflow passieren. Es ist ja gar nicht abzuschätzen, in wie vielen Fällen das passieren könnte. Gibt es eine Möglichkeit, einfach die Multiplikation auszuführen,, und dann erst herauszufinden, ob ein Overflow passiert ist. Angeblich soll das ja in irgendeinem Prozessor-Register abgespeichert werden, wenn ein Overflow passiert, aber wie kann ich das abfragen (soferne es denn überhaupt möglich ist, von einer Hochsprache wie C++ aus?)?</p>
<p>Besten Dank für Tipps !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525069</guid><dc:creator><![CDATA[Metatron]]></dc:creator><pubDate>Sun, 08 Jun 2008 11:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Sun, 08 Jun 2008 13:35:24 GMT]]></title><description><![CDATA[<p>Metatron schrieb:</p>
<blockquote>
<p>Gibt es eine Möglichkeit, einfach die Multiplikation auszuführen,, und dann erst herauszufinden, ob ein Overflow passiert ist.</p>
</blockquote>
<p>Kurz gesagt: nein. Überlaufe vorzeichenbehafteter Integeroperationen sind praktisch immer undefiniert. Selbst wenn dem nicht so wäre, könnte man mit dem Ergebnis nicht viel anfangen: denn dass das Ergebnis falsch ist, erkennt man direkt ja nur, wenn man es z.B. durch einen Faktor teilt und dann mit dem anderen vergleicht. Dann hätte man aber von vornherein testen können, ob ein Überlauf auftreten wird.</p>
<pre><code class="language-cpp">bool has_exact_product(int a, int b){ // true, wenn a*b als int darstellbar ist
  return a == 0
      || std::numeric_limits&lt;int&gt;::max() / abs( a ) &lt;= abs( b )
// Spezialfall bei 2er-Komplementdarstellung, hier ist -max() != min()
// und min() eine 2er-Potenz, mithin müssten beide Faktoren für dieses Ergebnis 2er-Potenzen sein
      || ( abs( a ) &amp; abs( a ) - 1 ) == 0 &amp;&amp; std::numeric_limits&lt;int&gt;::min() / a == b;
}
</code></pre>
<p>Edit: der Fall, dass a oder b jeweils std::numeric_limits&lt;int&gt;::min() sind, muss bei 2er-Komplement ebenfalls gesondert behandelt werden, abs ist dann undefiniert...</p>
<p>Natürlich kann es möglich sein, so etwas durch direkte Implementierung in Assembler zu vereinfachen und zu beschleunigen. Das sollte im Interesse der Übersichtlichkeit aber nur eine optionale Optimierung sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525106</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 08 Jun 2008 13:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Sun, 08 Jun 2008 13:06:53 GMT]]></title><description><![CDATA[<p>Danke für die erneute Hilfe. Ich war überrascht, dass sich Euklid's ggT-Algo in einer einzigen Codezeile notieren lässt.<br />
thx mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525125</guid><dc:creator><![CDATA[Metatron]]></dc:creator><pubDate>Sun, 08 Jun 2008 13:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Was soll ich da zurückgeben? on Sun, 08 Jun 2008 13:11:54 GMT]]></title><description><![CDATA[<p>Metatron schrieb:</p>
<blockquote>
<p>Danke für die erneute Hilfe. Ich war überrascht, dass sich Euklid's ggT-Algo in einer einzigen Codezeile notieren lässt.<br />
thx mfg</p>
</blockquote>
<p>In dieser Form kommt er ggf. nicht mit negativen Zahlen zurecht, je nachdem, wie sich das jeweilige System bei Divisionen mit negativen Zahlen verhält. Aber das kann man ja leicht durch einen entsprechenden Aufruf ausgleichen.</p>
<p>Generell würde ich für derartige Probleme interne Rechnungen immer mit vorzeichenlosen Zahlen durchführen - man erspart sich so einige Spezialfälle und hat mehr Möglichkeiten, mit Überläufen umzugehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525128</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 08 Jun 2008 13:11:54 GMT</pubDate></item></channel></rss>