<?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[BigInt operator + optimieren]]></title><description><![CDATA[<p>Hallo, ich bin dabei, eine Klasse für große positive Integer zu schreiben. Nun habe ich einen funktionierenden operator +, aber dieser kann bestimmt noch optimiert werden.</p>
<p>Die Klasse speichert ihre Daten so:</p>
<pre><code class="language-cpp">class BigInt
{
private:

	void* Content;
	unsigned int Length;	

};
</code></pre>
<p>Mein bisheriger operator + ist wie folgt definiert:</p>
<pre><code class="language-cpp">const BigInt operator+ (const BigInt&amp; lhs,const BigInt rhs)
{
	BigInt erg;
	if(lhs.Length == rhs.Length)
		if (( ((*static_cast&lt;char*&gt;(lhs.Content)) &amp; static_cast&lt;char&gt;(128))==static_cast&lt;char&gt;(128) ) || (((*static_cast&lt;char*&gt;(rhs.Content)) &amp; static_cast&lt;char&gt;(128))== static_cast&lt;char&gt;(128)))
			erg.Length = lhs.Length+1;
		else
			erg.Length = lhs.Length;
	else
		if(lhs.Length &gt; rhs.Length)
			erg.Length = lhs.Length;	
		else
			erg.Length = rhs.Length;

	erg.Content = malloc(sizeof(unsigned int)*erg.Length);

	unsigned int pos = 0;
	unsigned int ueb = 0;
	unsigned int aueb;
	while(pos &lt; erg.Length)
	{
		aueb = ueb;

		ueb = 0;
		unsigned int a;
		if (pos &lt; lhs.Length)
			a = *(static_cast&lt;unsigned int*&gt;(lhs.Content)+(lhs.Length-1-pos));		
		else
			a = 0;	

		unsigned int b;
		if (pos &lt; rhs.Length)
			b = *(static_cast&lt;unsigned int*&gt;(rhs.Content)+(rhs.Length-1-pos));	
		else
			b = 0;	

		ueb += (a&gt;&gt;31);
		ueb += (b&gt;&gt;31);

		a &amp;= 2147483647;
		a += (b &amp; 2147483647);

		a += aueb;			
		ueb += (a&gt;&gt;31);

		a &amp;= 2147483647; 
		unsigned int d = ueb % 2;

		a += (d&lt;&lt;31); 

		ueb &gt;&gt;= 1;

		(*(static_cast&lt;unsigned int*&gt;(erg.Content)+(erg.Length-1-pos))) = a;
		++pos;
	}

	return erg;
}
</code></pre>
<p>Habt ihr da noch Ideen, wie man das (vor allem von der Geschwindigkeit her) optimieren kann?</p>
<p>Vielen Dank für eure Mühe, Niko</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/137687/bigint-operator-optimieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 20:46:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/137687.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Feb 2006 19:55:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BigInt operator + optimieren on Sun, 19 Feb 2006 19:55:02 GMT]]></title><description><![CDATA[<p>Hallo, ich bin dabei, eine Klasse für große positive Integer zu schreiben. Nun habe ich einen funktionierenden operator +, aber dieser kann bestimmt noch optimiert werden.</p>
<p>Die Klasse speichert ihre Daten so:</p>
<pre><code class="language-cpp">class BigInt
{
private:

	void* Content;
	unsigned int Length;	

};
</code></pre>
<p>Mein bisheriger operator + ist wie folgt definiert:</p>
<pre><code class="language-cpp">const BigInt operator+ (const BigInt&amp; lhs,const BigInt rhs)
{
	BigInt erg;
	if(lhs.Length == rhs.Length)
		if (( ((*static_cast&lt;char*&gt;(lhs.Content)) &amp; static_cast&lt;char&gt;(128))==static_cast&lt;char&gt;(128) ) || (((*static_cast&lt;char*&gt;(rhs.Content)) &amp; static_cast&lt;char&gt;(128))== static_cast&lt;char&gt;(128)))
			erg.Length = lhs.Length+1;
		else
			erg.Length = lhs.Length;
	else
		if(lhs.Length &gt; rhs.Length)
			erg.Length = lhs.Length;	
		else
			erg.Length = rhs.Length;

	erg.Content = malloc(sizeof(unsigned int)*erg.Length);

	unsigned int pos = 0;
	unsigned int ueb = 0;
	unsigned int aueb;
	while(pos &lt; erg.Length)
	{
		aueb = ueb;

		ueb = 0;
		unsigned int a;
		if (pos &lt; lhs.Length)
			a = *(static_cast&lt;unsigned int*&gt;(lhs.Content)+(lhs.Length-1-pos));		
		else
			a = 0;	

		unsigned int b;
		if (pos &lt; rhs.Length)
			b = *(static_cast&lt;unsigned int*&gt;(rhs.Content)+(rhs.Length-1-pos));	
		else
			b = 0;	

		ueb += (a&gt;&gt;31);
		ueb += (b&gt;&gt;31);

		a &amp;= 2147483647;
		a += (b &amp; 2147483647);

		a += aueb;			
		ueb += (a&gt;&gt;31);

		a &amp;= 2147483647; 
		unsigned int d = ueb % 2;

		a += (d&lt;&lt;31); 

		ueb &gt;&gt;= 1;

		(*(static_cast&lt;unsigned int*&gt;(erg.Content)+(erg.Length-1-pos))) = a;
		++pos;
	}

	return erg;
}
</code></pre>
<p>Habt ihr da noch Ideen, wie man das (vor allem von der Geschwindigkeit her) optimieren kann?</p>
<p>Vielen Dank für eure Mühe, Niko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/998142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/998142</guid><dc:creator><![CDATA[Sir Niko]]></dc:creator><pubDate>Sun, 19 Feb 2006 19:55:02 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Mon, 20 Feb 2006 09:05:08 GMT]]></title><description><![CDATA[<p>in was für einer umgebung soll das laufen?<br />
es sieht aus wie 32bit, big-endian und integer-überläufe sind offenbar unerwünscht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/998312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/998312</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 20 Feb 2006 09:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Mon, 20 Feb 2006 11:21:47 GMT]]></title><description><![CDATA[<p>Length und MaxLength trennen und erlauben, daß nicht der ganze speicher verwendet wird oder führende nullen freizügiger verwenden.<br />
size_t statt unsigned int.<br />
auf gar keinen fall void* nehmen. wie wär's mit u32*? oder wenigstens u16*</p>
<pre><code class="language-cpp">const BigInt operator+ (const BigInt&amp; lhs,const BigInt rhs)
{
	BigInt erg;
</code></pre>
<p>gut für RVO</p>
<pre><code class="language-cpp">if(lhs.Length == rhs.Length)
		if (( ((*static_cast&lt;char*&gt;(lhs.Content)) &amp; static_cast&lt;char&gt;(128))==static_cast&lt;char&gt;(128) ) || (((*static_cast&lt;char*&gt;(rhs.Content)) &amp; static_cast&lt;char&gt;(128))== static_cast&lt;char&gt;(128)))
			erg.Length = lhs.Length+1;
		else
			erg.Length = lhs.Length;
	else
		if(lhs.Length &gt; rhs.Length)
			erg.Length = lhs.Length;	
		else
			erg.Length = rhs.Length;
</code></pre>
<p>WTF? das soll korrekt sein?</p>
<pre><code class="language-cpp">ueb += (a&gt;&gt;31);
		ueb += (b&gt;&gt;31);
</code></pre>
<p>nach<br />
c=a+b;<br />
weiß ich, daß ein überlauf passierte, wenn c&lt;a (oder c&lt;b), war das nicht so?mußt mal testen, ob das schneller wird.</p>
<pre><code class="language-cpp">Habt ihr da noch Ideen, wie man das (vor allem von der Geschwindigkeit her) optimieren kann?
</code></pre>
<p>jo. und die gehen mir auch nicht aus. zuerstmal ganz normal optimieren. dann vielleicht</p>
<pre><code class="language-cpp">void plus(BigInt* result,BigInt const&amp; a,BigInt const&amp; b)
</code></pre>
<p>und natürlich op+=.<br />
schauen, was mal mit expression templates machen kann.<br />
ein wenig inline-assembler, um ans carry-flag zu kommen.<br />
sollten die zahlen mit der höchstwertigen ziffer links oder rechts darestellt werden? vielleicht nicht int als elemente nehmen, sondern 256 bit große superziffern, deren operationen fein geunrollt und handoptimiert werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/998439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/998439</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 20 Feb 2006 11:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Mon, 20 Feb 2006 13:56:01 GMT]]></title><description><![CDATA[<p>Erstmal vielen Dank für die schnelle Antwort und die vielen Tips!</p>
<p>Zu dem Speichermanagement. Wie viel freizügiger sollte ich denn bei dem Speicher sein? Gibt es da sowas wie eine Faustformel?</p>
<p>Wenn ich Length und MaxLength trenne, wie finde ich dann am effizientesten die neue Length vom Ergebnis raus?</p>
<p>Warum sollte man size_t verwenden? Ist das portabler? Hat das sonstige Vorteile?</p>
<blockquote>
<p>WTF? das soll korrekt sein?</p>
</blockquote>
<p>Na ja, die Idee war einfach, nur wenn das erste (nicht von der Zahl, da ist es das logischerweise, sondern in m einem Speicherbereich) Bit von mindestens einer der Zahlen eins ist, dann kann das Ergebnis der Addition überhaupt so lang sein, dass es nicht mehr in den Speicherbereich passt, also nehme ich ein weiteres Stück hinzu. Sonst nehme ich die Länge der längeren Zahl.</p>
<blockquote>
<p>nach<br />
c=a+b;<br />
weiß ich, daß ein überlauf passierte, wenn c&lt;a (oder c&lt;b), war das nicht so?mußt mal testen, ob das schneller wird.</p>
</blockquote>
<p>Ist das so festgelegt? Kann ich mich darauf verlassen, dass das dann und nur dann der Fall ist? Und, steht dann in c trotzdem das &quot;richtige&quot; Ergebnis, nur halt ohne die führende 1?</p>
<blockquote>
<pre><code class="language-cpp">void plus(BigInt* result,BigInt const&amp; a,BigInt const&amp; b)
</code></pre>
</blockquote>
<p>Das ist leider nicht möglich. Die benutzung der Operaoren ist festgelegt. Operator += ist natürlich eine Idee, da hätte ich auch selber drauf kommen können.</p>
<blockquote>
<p>schauen, was mal mit expression templates machen kann.<br />
ein wenig inline-assembler, um ans carry-flag zu kommen.<br />
sollten die zahlen mit der höchstwertigen ziffer links oder rechts darestellt werden? vielleicht nicht int als elemente nehmen, sondern 256 bit große superziffern, deren operationen fein geunrollt und handoptimiert werden können.</p>
</blockquote>
<p>Ui, das überfordert mich erstmal ein bisschen. Leider habe ich keine Ahnung, was expression templates sind oder wie man diese benutzt. Auch Assembler kann ich leider nicht. Aber ich würde gerne dazulernen.<br />
Wie würde man denn diese 256 bit großen Superziffern konstruieren? Wo bekäme ich die her?</p>
<p>So, das sind wohl ziemlich viele Fragen auf einmal, aber ich hoffe ihr könnt mir trotzdem weiterhelfen.</p>
<p>Nochmal vielen Dank für die Mühe, Niko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/998575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/998575</guid><dc:creator><![CDATA[Sir Niko]]></dc:creator><pubDate>Mon, 20 Feb 2006 13:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Mon, 20 Feb 2006 14:47:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Ui, das überfordert mich erstmal ein bisschen. Leider habe ich keine Ahnung, was expression templates sind oder wie man diese benutzt</p>
</blockquote>
<p>Hier der Artikel von Todd persönlich: <a href="http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html" rel="nofollow">http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html</a><br />
Und hier noch was auf Deutsch: <a href="http://www.hlrs.de/people/mueller/tutorials/script/scriptse26.html" rel="nofollow">http://www.hlrs.de/people/mueller/tutorials/script/scriptse26.html</a></p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/998634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/998634</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Mon, 20 Feb 2006 14:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Mon, 20 Feb 2006 19:29:08 GMT]]></title><description><![CDATA[<p>es dürfte sinnvoll sein, zunächst mit abstrakteren objekten zu arbeiten, bevor microoptimierung wie optimierte speicherverwaltung/assembler-routinen etc. an der reihe ist. ich würde zunächst einen vector&lt;T&gt; benutzen - optimierungen wie z.b. direkte benutzung eines allokators i.V.m. z.b. shared_array sind relativ leicht einzufügen und nicht grundlegend für die funktionalität. auch die festlegung auf eine bestimmte größe der basiszahlen ist in diesem stadium weder sinnvoll noch nützlich. ein einfaches typedef soll an dessen stelle treten - damit vermeidet man auch leicht versehentliche architektonische abhängigkeiten. wenn geschwindigkeit eine grosse rolle spielt, ist ein little-endian speicherlayout empfehlenswert: da alle einfachen grundrechenarten (division ist recht kompliziert und bleibt hier erst mal aussen vor) von der kleinsten stelle her arbeiten - ein speicherzugriffsmuster, das mit linear aufsteigenden adressen arbeitet, ist im allgemeinen am effektivsten, da es durch die hardware direkt unterstützt wird. es hat auch den vorteil, dass wir uns nicht vorher überlegen müssen, ob ein überlauf stattfinden wird - und wenn doch wird ein push_back i.d.R. nicht zu reallokation führen.<br />
+ mittels += zu implementieren ist möglich, allerdings in diesem falle ohne spezielle hardwareunterstüzung und sehr smarte compiler nicht empfehlenswert:<br />
bei += wird zunächst einen kopie angefertigt, dann wird diese kopie mit dem anderen operanden verknüpft und verändert. man hat es also im grunde mit 3 lese und 2 schreibvorgängen pro stelle zu tun, anstelle von 2 lese und 1 schreiboperation - zusätzlich kann man nicht von write-combining profitieren.<br />
(anm. + mittels += zu implementieren ist immer dann smart, wenn die zugrundeliegende struktur skalar (und nicht zu gross) ist, dann kann der compiler den kopierschritt relativ leicht eliminieren).</p>
<p>speziell zu + :<br />
es könnte sinnvoll sein, dafür zu sorgen, dass operand a stets &gt;= als operand b ist, dann kann man die addition nähmlich sehr schön in drei phasen aufteilen:<br />
- zunächst werden ziffern aus a und b und evtl. überlauf verarbeitet und ins ergebnis geschrieben, solange bis alle ziffern von b verbraucht sind<br />
- jetzt ist nur noch ein evtl. übertrag zu beachten, addiere diesen, bis er verschwindet<br />
- die restlichen ziffern von a werden direkt kopiert<br />
um diese vorbedingung zu erreichen, müssen wir delegieren, ein rekursiver aufruf von + mit vertauschten operanden, würde uns die NRVO ruinieren.</p>
<p>wie überträge erfasst werden, hängt ein bisschen von der plattform ab - formal gesehen sind überläufe UB, für 100% standard-konformen code müsste man diese vorher auffangen, wir gehen hier davon aus, dass überläufe ignoriert werden (mit inline assembler geht es nat. am besten, dank carry)</p>
<pre><code class="language-cpp">class BigInt
{
private:
    template unsigned base_int;
    std::vector&lt;base_int&gt; value;

    friend bool operator&lt;(const BigInt&amp; lhs, const BigInt&amp; rhs);
    friend BigInt operator+(const BigInt&amp; lhs, const BigInt&amp; rhs)
    {
        struct
        {
            BigInt operator()(const BigInt&amp; lhs, const BigInt&amp; rhs) const
            {
                BigInt result;
                result.value.reserve( lhs.size() );
                typedef std::vector&lt;base_int&gt;::const_iterator const_iterator;
                const_iterator lhs_pos = lhs.value.begin();
                bool carry = false;
                for ( const_iterator rhs_pos = rhs.value.begin(); rhs_pos != rhs.value.end(); )
                {
                    base_int c = *lhs_pos++ + *rhs_pos;
                    if ( c &lt; *rhs_pos++ )
                    {
                        result.value.push_back( c + carry );
                        carry = true;
                    }
                    else
                    {
                        result.value.push_back( c += carry );
                        carry = carry &amp;&amp; c == 0;
                    }
                }
                while ( carry &amp;&amp; lhs_pos != lhs.value.end() )
                {
                    base_int c = 1 + *lhs_pos++;
                    carry = c == 0;
                    result.value.push_back( c );
                }
                if ( carry )
                    result.value.push_back( 1 );
                else
                    while ( lhs_pos != lhs.value.end() )
                        result.value.push_back( *lhs_pos++ );
            }
        } add;
        return rhs &lt; lhs ? add( rhs, lhs ) : add( lhs, rhs );
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/998890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/998890</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 20 Feb 2006 19:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Tue, 21 Feb 2006 13:31:20 GMT]]></title><description><![CDATA[<p>Vielen Dank erstmal für die viele Mühe, leider meckert mein Compiler (dev-c++) bei folgender Zeile:</p>
<pre><code class="language-cpp">template unsigned base_int;
</code></pre>
<p>Die Fehlermeldung ist:</p>
<pre><code class="language-cpp">43  expected `&lt;' before &quot;unsigned&quot;
</code></pre>
<p>Sollte dort anstat dem template vieleicht ein typedef stehen?</p>
<p>MFg, Niko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/999379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/999379</guid><dc:creator><![CDATA[Sir Niko]]></dc:creator><pubDate>Tue, 21 Feb 2006 13:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Tue, 21 Feb 2006 13:53:29 GMT]]></title><description><![CDATA[<p>Sir Niko schrieb:</p>
<blockquote>
<p>Sollte dort anstat dem template vieleicht ein typedef stehen?</p>
</blockquote>
<p>genau, kleiner tippfehler. das typedef wurde ja auch im text erwähnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/999407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/999407</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 21 Feb 2006 13:53:29 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Tue, 21 Feb 2006 14:03:09 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: du scheinst so ne klasse schon fertig zu haben. magste die zeigen? oder wenn nicht fertig, dann ein paar fragmente. deine überlegungen sind toll, da mag ich was lernen von.<br />
und base_int sollte Digit heißen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/999418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/999418</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 21 Feb 2006 14:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Tue, 21 Feb 2006 14:09:34 GMT]]></title><description><![CDATA[<p>Sir Niko schrieb:</p>
<blockquote>
<p>Zu dem Speichermanagement. Wie viel freizügiger sollte ich denn bei dem Speicher sein? Gibt es da sowas wie eine Faustformel?</p>
</blockquote>
<p>ja, vielleicht.<br />
&quot;eng&quot; ist ein dehnungbegriff.<br />
und<br />
was nicht paßt, wird passend gemacht.</p>
<p>ich dachte an:<br />
result.maxSize=max(a.size,b.size)+1;<br />
und nach dem addieren wird noch geschaut, ob die größte stelle 0 ist, wenn ja, dann wird result.usedSize=result.maxSize-1;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/999427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/999427</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 21 Feb 2006 14:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Tue, 21 Feb 2006 15:00:12 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>, danke, das mit der speichergröße scheint mir sinvoll, das werde ich nachher direkt mal ändern, sobald ich Zeit habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/999464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/999464</guid><dc:creator><![CDATA[Sir Niko]]></dc:creator><pubDate>Tue, 21 Feb 2006 15:00:12 GMT</pubDate></item><item><title><![CDATA[Reply to BigInt operator + optimieren on Tue, 21 Feb 2006 16:33:59 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: du scheinst so ne klasse schon fertig zu haben. magste die zeigen? oder wenn nicht fertig, dann ein paar fragmente. deine überlegungen sind toll, da mag ich was lernen von.<br />
und base_int sollte Digit heißen.</p>
</blockquote>
<p>eigentlich hab ich da nichts, die überlegungen sind im grunde nur solche zu anderen problemen die ich hierauf übertragen habe. aber vielleicht skizziere ich noch ein paar sachen.<br />
ein paar dinge, die noch zu überlegen sind:<br />
- vorzeichenlose/-behaftete zahlen, dem grunde nach gibt es keinen grund, vorzeichenlose zahlen zu haben, denn speicherplatz ist ja formal kein problem. dann muss man sich aber überlegen, wie negative zahlen darzustellen sind - die wahl beeinflusst die komplexität (nicht im sinne von O() aber als text) der algorithmen; es bieten sich an 1er-/2er komplement (hier muss man die zahl ggf. künstlich verländern) oder signed magnitude (eine kurze übersetzung fällt mir dazu gerade nicht ein).<br />
- hat man integer, möchte man vielleicht auch fixkomma zahlen haben (die durchaus in beide richtungen vom komma wachsen können). mit dem richtigen dreh, sollte man das unter einen hut bekommen können<br />
- speicherverwaltungsmässig hat man verschiedene optionen, ich habe hier der bequemlichkeit halber vector gewählt, so kann ich mich erst mal auf die grundlegenden funktionen konzentrieren; aber es gibt hier die üblichen optionen: normales oder überladens new/delete und/oder per allokator evtl. mit referenzcounting<br />
- lazy evaluation von ausdrücken mittels expression templates: das ist zum glück weitgehend orthogonal zum rest, man kann also erst einmal etwas fertiges bauen und diese funktionalität später integrieren; selbiges gilt für exotischere sachen wie assembler routinen</p>
<p>zu meinem code oben: es fehlt nat. noch ein return in add<br />
und statt b &lt; a (das ja eine komplexität von O(N) hat), genügt es, die anzahl der stellen jeder zahl zu vergleichen - sofern beide zahlen dieselbe anzahl von stellen haben, spielt die reihenfolge ja keine rolle</p>
]]></description><link>https://www.c-plusplus.net/forum/post/999544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/999544</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 21 Feb 2006 16:33:59 GMT</pubDate></item></channel></rss>