<?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[complex&amp;lt;&amp;gt;]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;complex&gt;
#include &lt;iostream&gt;

typedef float my_float;
// typedef double my_float;

int main()
{
  std::complex&lt;my_float&gt; c(1.0,1.0);

  std::cout &lt;&lt; (c / 2.0) &lt;&lt; std::endl; // (*)

  return 0;
}
</code></pre>
<p>Wenn my_float vom Typ double ist, funktioniert der Code. Falls my_float vom Typ float ist, geht Zeile (*) nicht mehr, weil 2.0 anscheinend ein double ist und der op/ dann nicht mehr definiert ist.</p>
<p>Wie kann ich Zeile (*) schreiben oder wie kann ich das Problem umgehen, so dass der Code in beiden Fällen funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268842/complex-lt-gt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 16:15:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268842.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jun 2010 08:16:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:16:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;complex&gt;
#include &lt;iostream&gt;

typedef float my_float;
// typedef double my_float;

int main()
{
  std::complex&lt;my_float&gt; c(1.0,1.0);

  std::cout &lt;&lt; (c / 2.0) &lt;&lt; std::endl; // (*)

  return 0;
}
</code></pre>
<p>Wenn my_float vom Typ double ist, funktioniert der Code. Falls my_float vom Typ float ist, geht Zeile (*) nicht mehr, weil 2.0 anscheinend ein double ist und der op/ dann nicht mehr definiert ist.</p>
<p>Wie kann ich Zeile (*) schreiben oder wie kann ich das Problem umgehen, so dass der Code in beiden Fällen funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912606</guid><dc:creator><![CDATA[Mups]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:28:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::cout &lt;&lt; ( c / 2.0f ) &lt;&lt; std::endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1912615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912615</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:40:10 GMT]]></title><description><![CDATA[<p>Danke. Das ging ja fix. Vielleicht habe ich zu viel vereinfacht. Hier mal ein realitätsnahes Beispiel mit ein bisschen Physik:</p>
<pre><code class="language-cpp">my_float om = 0.1, k = 1.0, draft = 5.0, h = 1000.0, xmin=200.0;
  std::complex&lt;my_float&gt; waveVecx(1.0, 10.0);
  std::complex&lt;my_float&gt; waveVecy(1.0, 10.0);
  std::complex&lt;my_float&gt; CI(0.0,1.0);

  std::complex&lt;my_float&gt; vyWave = om * waveVecy / CI / k * cosh( k * (draft/2.0f-h)) / sinh(k * h) * exp(xmin*waveVecx);
</code></pre>
<p>Problematisch sind hier anscheinend die drei Funktionen cosh, sinh und exp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912618</guid><dc:creator><![CDATA[Mups]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:45:47 GMT]]></title><description><![CDATA[<p>Der Code kompiliert bei mir einwandfrei. Sollte auch keine Probleme machen in C++, da es für <code>cosh</code> , <code>sinh</code> und <code>exp</code> Überladungen für <code>float</code> und <code>double</code> gibt. Einziges Problem könnte die Initialisierung deiner Variablen darstellen, aber das resultiert höchstens in einer Warnung.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912622</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:46:52 GMT]]></title><description><![CDATA[<p>Erst denken, dann fragen:</p>
<pre><code class="language-cpp">std::complex&lt;my_float&gt; vyWave = om * waveVecy / CI / k * my_float(cosh( k * (draft/2.0f-h)) / sinh(k * h)) * exp(xmin*waveVecx);
</code></pre>
<p>scheint zu gehen. Auch wenn das leider nicht zu einer erhöhten Lesbarkeit des Codes führt, wenn sowas häufiger auftaucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912623</guid><dc:creator><![CDATA[Mups]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:46:52 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:49:08 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Der Code kompiliert bei mir einwandfrei. Sollte auch keine Probleme machen in C++, da es für <code>cosh</code> , <code>sinh</code> und <code>exp</code> Überladungen für <code>float</code> und <code>double</code> gibt. Einziges Problem könnte die Initialisierung deiner Variablen darstellen, aber das resultiert höchstens in einer Warnung.</p>
<p>Grüssli</p>
</blockquote>
<p>Huch, das überrascht mich.</p>
<pre><code class="language-cpp">#include &lt;complex&gt;
#include &lt;iostream&gt;

typedef float my_float;

int main()
{
  my_float om = 0.1, k = 1.0, draft = 5.0, h = 1000.0, xmin=200.0;
  std::complex&lt;my_float&gt; waveVecx(1.0, 10.0);
  std::complex&lt;my_float&gt; waveVecy(1.0, 10.0);
  std::complex&lt;my_float&gt; CI(0.0,1.0);

  std::complex&lt;my_float&gt; vyWave = om * waveVecy / CI / k * cosh( k * (draft/2.0f-h))  / sinh(k * h) * exp(xmin*waveVecx);

  return 0;
}
</code></pre>
<p>führt zu</p>
<pre><code>xxxxxx@yyyyyy:test g++ complex.cpp -ocomplex
complex.cpp:16:2: warning: no newline at end of file
complex.cpp: In function ‘int main()’:
complex.cpp:13: error: no match for ‘operator*’ in ‘std::operator/ [with _Tp = float](((const std::complex&lt;float&gt;&amp;)((const std::complex&lt;float&gt;*)(&amp; std::operator/ [with _Tp = float](((const std::complex&lt;float&gt;&amp;)((const std::complex&lt;float&gt;*)(&amp; std::operator* [with _Tp = my_float](((const my_float&amp;)((const my_float*)(&amp; om))), ((const std::complex&lt;float&gt;&amp;)((const std::complex&lt;float&gt;*)(&amp; waveVecy))))))), ((const std::complex&lt;float&gt;&amp;)((const std::complex&lt;float&gt;*)(&amp; CI))))))), ((const float&amp;)((const float*)(&amp; k)))) * cosh(((double)(((draft / 2.0e+0f) - h) * k)))’
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1912625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912625</guid><dc:creator><![CDATA[Mups]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 08:51:08 GMT]]></title><description><![CDATA[<p>Der Cast ist völlig unnötig, wenn dein Kompiler eine korrekte Standardbibliothek hat. Und die Zeile ist schon so oder so unleserlich. Am besten setzt du Zwischenergebnisse ein, um die Leserlichkeit zu erhöhen.</p>
<p>Edit: In Bearbeitung ... zu viele Posts zu schnell hintereinander ...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912626</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 15 Jun 2010 08:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 09:18:17 GMT]]></title><description><![CDATA[<p>Ok, sorry für den Doppelpost, aber nur mit dem Edit sieht man nicht, dass was neues da ist.</p>
<p>Anscheinend weiss der GCC Kompiler nichts besseres zu tun, als vor dem Übergeben an <code>sinh</code> und <code>cosh</code> das Ergebnis der Operation in <code>double</code> zu konvertieren. Keine Ahnung wie der auf diese bescheuerte Idee kommt. Wenn man die Berechnung von <code>cosh</code> und <code>sinh</code> aus der Zeile rausnimmt und vorher ausrechnet, dann geht es wunderbar:</p>
<pre><code class="language-cpp">float r0 = sinh(k * h);
float r1 = cosh(k * (draft / 2.0f - h));

std::complex&lt;my_float&gt; vyWave = om * waveVecy / CI / k * r1 / r0 * exp(xmin*waveVecx);
</code></pre>
<p>Spricht auf der anderen Seite dafür, dass man Zwischenergebnisse verwenden sollte <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912638</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 15 Jun 2010 09:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 11:03:14 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Anscheinend weiss der GCC Kompiler nichts besseres zu tun, als vor dem Übergeben an <code>sinh</code> und <code>cosh</code> das Ergebnis der Operation in <code>double</code> zu konvertieren.</p>
</blockquote>
<p>Das liegt wohl daran, dass sinh und cosh mit<br />
`</p>
<p>double sinh(double);</p>
<p>double cosh(double);</p>
<p>`<br />
<em>zufällig</em> aus der C-Library sichtbar sind. Ich sehe hier kein &lt;cmath&gt; und auch keine std::-Qualifizierung bzw using-Deklarationen. Richtig müsste es doch <a href="http://codepad.org/ciyOSnkS" rel="nofollow">so</a> aussehen, nicht?</p>
<pre><code class="language-cpp">#include &lt;complex&gt;
#include &lt;cmath&gt;      // &lt;--- !!!
#include &lt;iostream&gt;

typedef float my_float;

int main()
{
  using std::cosh;  // &lt;--- !!!
  using std::sinh;  // &lt;--- !!!
  using std::exp;   // &lt;--- !!!
  my_float om = 0.1, k = 1.0, draft = 5.0, h = 1000.0, xmin=200.0;
  std::complex&lt;my_float&gt; waveVecx(1.0, 10.0);
  std::complex&lt;my_float&gt; waveVecy(1.0, 10.0);
  std::complex&lt;my_float&gt; CI(0.0,1.0);

  std::complex&lt;my_float&gt; vyWave = om * waveVecy / CI / k *
    cosh( k * (draft/2.0f-h))  / sinh(k * h) * exp(xmin*waveVecx);

  return 0;
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912679</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 15 Jun 2010 11:03:14 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 11:47:38 GMT]]></title><description><![CDATA[<p><code>&lt;cmath&gt;</code> hatte ich dazugefügt, wird allerdings mit <code>&lt;complex&gt;</code> beim GCC dazugefügt. Allerdings ist das Problem wirklich das <code>using</code> . Beim MSVC wird alles im globalen Namensraum deklariert und dann in den Namensraum <code>std</code> mit <code>using</code> hineingezogen. Hatte ich ganz vergessen, dass dies nicht dem Standard entspricht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Wobei ich mich trotzdem frage, wieso der Fall mit den Zwischenergebnissen dann funktioniert? Führt er dann zweimal eine implizite Konvertierung durch? Einmal nach double, was ja kein Problem ist, und einmal nach float, was ich zumindest für warnungsberechtigt halten würde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912708</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 15 Jun 2010 11:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to complex&amp;lt;&amp;gt; on Tue, 15 Jun 2010 20:51:26 GMT]]></title><description><![CDATA[<p>Ah, jetzt kapiere ich. Vielen dank!</p>
<p>ps:</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>: So längliche Formeln finde ich nicht schön, Zwischenergebnisse aber (oft) noch unschöner. In so einer Formel ist jede größe physikalisch, sowohl links als auch rechts. Wenn man jetzt formal unphysikalische Zwischenergebnisse einführt, stört das den Lesefluss auch ganz erheblich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912991</guid><dc:creator><![CDATA[Mups]]></dc:creator><pubDate>Tue, 15 Jun 2010 20:51:26 GMT</pubDate></item></channel></rss>