<?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[Endlosschleife beim Potenzrechnen]]></title><description><![CDATA[<p>Hallo,</p>
<p>momentan stehe ich vor einer gewaltigen Endlosschleife. Und zwar möchte ich zur Compilezeit Potenzen und Logarithmen errechnen können. Allerdings stecke ich noch bei dem ersten Punkt fest.</p>
<pre><code class="language-cpp">template&lt;int expo&gt;
inline double power(const int&amp; basis)
{
	switch(expo)
	{
		case expo == - 1 :
			return 1.0 / basis;
			break;
		case expo == 1:
			return basis;
			break;
		case expo == 0:
			return 1.0;
			break;
		case expo &lt; -1:
			return power&lt;expo+1&gt;(basis) * (1.0/basis);
			break;
		default:
			return power&lt;expo-1&gt;(basis) * basis;
	}
}
</code></pre>
<p>Mir war hierbei wichtig, dass sowohl positiver und negativer Exponent möglich sind. Aber schon beim der Eingabe 2,2 geht es kaputt. Auch wenn ich per Hand nachspiele komme ich nicht in die Endlosschleife.</p>
<p>Könnt ihr mir hier vielleicht weiter helfen? Bzw. gibt es für den Logarithmus schon etwas vorgefertigtes?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251835/endlosschleife-beim-potenzrechnen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 06:46:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251835.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Oct 2009 13:18:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 13:18:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>momentan stehe ich vor einer gewaltigen Endlosschleife. Und zwar möchte ich zur Compilezeit Potenzen und Logarithmen errechnen können. Allerdings stecke ich noch bei dem ersten Punkt fest.</p>
<pre><code class="language-cpp">template&lt;int expo&gt;
inline double power(const int&amp; basis)
{
	switch(expo)
	{
		case expo == - 1 :
			return 1.0 / basis;
			break;
		case expo == 1:
			return basis;
			break;
		case expo == 0:
			return 1.0;
			break;
		case expo &lt; -1:
			return power&lt;expo+1&gt;(basis) * (1.0/basis);
			break;
		default:
			return power&lt;expo-1&gt;(basis) * basis;
	}
}
</code></pre>
<p>Mir war hierbei wichtig, dass sowohl positiver und negativer Exponent möglich sind. Aber schon beim der Eingabe 2,2 geht es kaputt. Auch wenn ich per Hand nachspiele komme ich nicht in die Endlosschleife.</p>
<p>Könnt ihr mir hier vielleicht weiter helfen? Bzw. gibt es für den Logarithmus schon etwas vorgefertigtes?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790929</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 11 Oct 2009 13:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 13:34:08 GMT]]></title><description><![CDATA[<p>Du vermischt case und if</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790941</guid><dc:creator><![CDATA[ähm]]></dc:creator><pubDate>Sun, 11 Oct 2009 13:34:08 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 13:50:31 GMT]]></title><description><![CDATA[<p>oh ja danke.<br />
Vermutlich habe ich mir dieses zu oft angeschaut.</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790948</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 11 Oct 2009 13:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 14:09:29 GMT]]></title><description><![CDATA[<p>so?</p>
<pre><code class="language-cpp">template&lt;int expo&gt;
double power(int basis)
{ 
    switch(expo) 
    { 
        case -1: 
            return 1.0 / basis; 
        case 1: 
            return basis; 
        case 0:
            return 1.0; 

        default:
            if(i &lt; 0)
              return power&lt;expo+1&gt;(basis) * (1.0/basis);
            else
              return power&lt;expo-1&gt;(basis) * basis; 
    } 
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790954</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 11 Oct 2009 14:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 14:47:04 GMT]]></title><description><![CDATA[<p>Das ist irgendwie nix halbes und nix ganzes. So würde man die Funktion schreiben, wenn sie KEIN Template wäre. Sie ist es aber (aus irgendeinem Grund). Wenn ich also power&lt;50&gt; benutzen will, generiert der Compiler auch alle anderen Funktionen power&lt;N&gt; für 0&lt;=N&lt;=50. Wie Banane ist das? Außerdem müsste man mal testen, ob der durchschnittliche Compiler so schlau ist, das ganze switch/case Zeug zu eliminieren. expo ist ja zur Compilezeit bekannt. Um da auf Nummer sicher zu gehen und die Zahl der zu instanziierenden Templates zu reduzieren könnte man es so machen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;int Power, int Case&gt;
struct powr { // Fall Power&gt;0 und Power gerade
  static inline double doit(double base) {
    return powr&lt;(Power/2),((Power/2)%2)&gt;::doit(base*base);
  }
};
template&lt;int Power&gt;
struct powr&lt;Power,1&gt; { // Fall Power&gt;0 und Power ungerade
  static inline double doit(double base) {
    return powr&lt;(Power/2),((Power/2)%2)&gt;::doit(base*base)*base;
  }
};
template&lt;int Power&gt;
struct powr&lt;Power,-1&gt; { // Fall Power&lt;0
  static inline double doit(double base) {
    return 1.0/powr&lt;(-Power),((-Power)%2)&gt;::doit(base);
  }
};
template&lt;int Case&gt;
struct powr&lt;0,Case&gt; { // Fall Power==0
  static inline double doit(double base) {
    return 1.0;
  }
};

template&lt;int Expo&gt;
double power(double base) {
  return powr&lt;Expo,( Expo&lt;0 ? -1 : Expo%2 )&gt;::doit(base);
}

int main()
{
	std::cout &lt;&lt; power&lt;5&gt;(2) &lt;&lt; '\n';
}
</code></pre>
<p>(Square-And-Multiply Algorithmus)</p>
<p>Wenn hier power&lt;50&gt; aufgerufen wird, werden nur powr&lt;50,0&gt;, powr&lt;25,1&gt;, powr&lt;12,0&gt;, powr&lt;6,0&gt;, powr&lt;3,1&gt;, powr&lt;1,1&gt;, powr&lt;0,0&gt; instanziiert.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790969</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 11 Oct 2009 14:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 15:33:54 GMT]]></title><description><![CDATA[<p>Sebastian Pizer du bist Freund der theo. Inf. richtig?</p>
<p>Der Square-And-Multiply Algorithmus kommt mir noch schwer bekannt vor <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<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790991</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 11 Oct 2009 15:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Sun, 11 Oct 2009 15:39:30 GMT]]></title><description><![CDATA[<p>MrMilk schrieb:</p>
<blockquote>
<p>Sebastian Pizer du bist Freund der theo. Inf. richtig?</p>
<p>Der Square-And-Multiply Algorithmus kommt mir noch schwer bekannt vor <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<br />
MM</p>
</blockquote>
<p>Ich hab mich auch scho ab und an gefragt^^</p>
<p><a href="http://pizer.wordpress.com/about/" rel="nofollow">pizer.wordpress.com/about/</a> schrieb:</p>
<blockquote>
<p>Me: I studied computer science (MSc) with an emphasis on models, algorithms and math. I learned a lot about digital signal processing and data compression over the past 10 years (mostly self-tought).</p>
<p>Blog: This blog is about programming, DSP, math, etc. Stuff you can’t talk about with your neighbour or most real-life friends.</p>
</blockquote>
<p>mehr hab ich dann aber auch nicht gefunden <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=";D"
      alt="😉"
    /></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790995</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 11 Oct 2009 15:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Mon, 12 Oct 2009 08:29:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>da mir die Lösung von SP ganz gut gefällt, habe ich ich einmal dazu entschlossen sie nach zu programmieren. Allerdings mit der Änderung, dass keine Funktionen genutzt werden, da ich später den Wert innerhalb einer Struktur benötige. Bis jetzt ist folgendes herausgekommen:</p>
<pre><code class="language-cpp">template
&lt;
	int Basis,
	int Expo
&gt;
struct Power
{
	static const double value = (Expo %2 == 1)?
			(
				Basis * Power &lt;Basis,(Expo &lt; 0)? Expo+1: Expo-1&gt;::value
			)
			:
			(
				Power&lt;Basis, Expo/2&gt;::value * Power&lt;Basis, Expo/2&gt;::value
			);
};

template
&lt;
	int Basis
&gt;
struct Power&lt;Basis, 0&gt;
{
	static const double value = 1.0;
};

template
&lt;
	int Basis
&gt;
struct Power&lt;Basis,-1&gt;
{
	static const double value = Basis;
};

template
&lt;
	int Basis
&gt;
struct Power&lt;Basis, 1&gt;
{
	static const double value = Basis;
};

template
&lt;
	int Basis,
	int Expo
&gt;
struct power_
{
	static const double value = (Expo &lt; 0)?  (1.0/ Power&lt;Basis, Expo&gt;::value) : (Power&lt;Basis, Expo&gt;::value) ;

};
</code></pre>
<p>Leider bekomme ich etwas vom Compiler auf die Ohren, sobald ich folgendes aufrufe:</p>
<pre><code class="language-cpp">cout &lt;&lt; power_&lt;2,3&gt;::value &lt;&lt; endl;
</code></pre>
<p>Und zwar mit dieser Fehlermeldung:</p>
<blockquote>
<p>Undefined symbols:<br />
&quot;power_&lt;2, 3&gt;::value&quot;, referenced from:<br />
__ZN6power_ILi2ELi3EE5valueE$non_lazy_ptr in BaTest.o<br />
ld: symbol(s) not found<br />
collect2: ld returned 1 exit status</p>
</blockquote>
<p>Könnt ihr mir hier weiterhelfen?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791233</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Mon, 12 Oct 2009 08:29:10 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Mon, 12 Oct 2009 09:03:57 GMT]]></title><description><![CDATA[<p>Klappt denn</p>
<pre><code class="language-cpp">double x=power_&lt;2,3&gt;::value;
cout &lt;&lt; x &lt;&lt; endl;
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791246</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 12 Oct 2009 09:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Mon, 12 Oct 2009 09:10:51 GMT]]></title><description><![CDATA[<p>Ne, leider auch nicht bekomme hier ebenfalls:</p>
<blockquote>
<p>Undefined symbols:<br />
&quot;power_&lt;2, 3&gt;::value&quot;, referenced from:<br />
__ZN6power_ILi2ELi3EE5valueE$non_lazy_ptr in Test.o</p>
</blockquote>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791248</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Mon, 12 Oct 2009 09:10:51 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Mon, 12 Oct 2009 09:12:20 GMT]]></title><description><![CDATA[<p>Da scheinen mir die Definitionen deiner statischen Datenmember zu fehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791249</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Oct 2009 09:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife beim Potenzrechnen on Mon, 12 Oct 2009 09:50:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct foo{
  static const int blah = 3;
}
</code></pre>
<p>...ist nur eine <strong>Deklaration</strong> von blah und keine <strong>Definition</strong>. Es wird also nirgens Speicher dafür angelegt. Für &quot;konstante Ganzzahltypen&quot; (integral types) wird aber eine &quot;Initialisierung&quot; in der in-class Deklaration erlaubt. Solange nur der Wert von blah benutzt wird und zB nicht die Adresse von blah benötigt wird, ist auch keine Definition von blah nötig.</p>
<p>Bei Dir soll <code>value</code> aber vom Typ double sein. Für double gilt die Ganzzahltypen-Sonderregel natürlich nicht.</p>
<p>Das folgende Programm wird gnädigerweise vom G++ (3.4.5) erfolgreich, auch ohne Linker-Fehler, übersetzt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;int Base, int Power&gt;
struct powr
{
   static const double value =
      powr&lt;(Base*Base),(Power/2)&gt;::value
    * powr&lt;      Base ,(Power%2)&gt;::value;
};

template&lt;int Base&gt;
struct powr&lt;Base,1&gt;
{
   static const double value = Base;
};

template&lt;int Base&gt;
struct powr&lt;Base,0&gt;
{
   static const double value = 1.0;
};

template&lt;int Base&gt;
struct powr&lt;Base,-1&gt;
{
   static const double value = 1.0/Base;
};

int main()
{
  double const x = powr&lt;2,3&gt;::value;
  std::cout &lt;&lt; x &lt;&lt; '\n';
}
</code></pre>
<p>Es ist aber nicht Standard-konform. Der <a href="http://www.comeaucomputing.com/tryitout/" rel="nofollow">Comeau C/C++ Online-Compiler</a> sagt dazu folgendes:</p>
<pre><code>Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

&quot;ComeauTest.c&quot;, line 6: error: a member of type &quot;const double&quot; cannot have an
          in-class initializer
     static const double value =
                               ^

&quot;ComeauTest.c&quot;, line 14: error: a member of type &quot;const double&quot; cannot have an
          in-class initializer
     static const double value = Base;
                               ^

&quot;ComeauTest.c&quot;, line 20: error: a member of type &quot;const double&quot; cannot have an
          in-class initializer
     static const double value = 1.0;
                               ^

&quot;ComeauTest.c&quot;, line 26: error: a member of type &quot;const double&quot; cannot have an
          in-class initializer
     static const double value = 1.0/Base;
                               ^

4 errors detected in the compilation of &quot;ComeauTest.c&quot;.
</code></pre>
<p>Recht hat er.</p>
<p>Warum schreibst Du nicht einfach std::pow(2,3)? Der GCC rechnet das, soweit ich weiß, trotzdem zur Compilezeit aus. Dieses Verhalten wird zwar nicht vom C++ Standard garantiert, zeichnet aber einen guten Compiler meiner Meinung nach aus.</p>
<p>Gruß,<br />
SP</p>
<p>P.S: Ja, ich habe Informatik mit Schwerpunkt &quot;Modelle &amp; Algorithmen&quot; studiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791260</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 12 Oct 2009 09:50:38 GMT</pubDate></item></channel></rss>