<?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[Seltsames verhalten von (long) double beim * und *= Operator]]></title><description><![CDATA[<p>Hallo, in meiner Matrixklasse habe ich zum Multiplizieren den * und *= Operator eingerichtet. Dabei gibt der * Operator die richtigen Werte aus, wohingegen der *= Operator extrem ungenau ist. zB. bei der Multiplikation der (long double) Matrix</p>
<pre><code>0.5 0.3 0.6
0.2 0.2 0.1
0.3 0.5 0.3
</code></pre>
<p>mit sich selbst, erhalte ich für das Element [0][0] der ErgebnisMatrix folgende werte:</p>
<pre><code>Erwarteter Wert:         0.49
Von * errechneter Wert:  0.489999999999999999 //O.K.
Von *= errechneter Wert: 0.500000000000000000 //Abweichung von
                                              //0.1
</code></pre>
<p>Die von *= ermittelten Werte weichen im Schnitt um 0.1 bis 0.2 vom richtigen Wert ab (was ja um ein vielfaches über dem zu erwartenden Rundungsfehler liegt). Dabei habe ich beide Opertoren (ungefähr) gleich implementiert (der Rechenweg kann also nicht Schuld sein):</p>
<pre><code class="language-cpp">//* Operator
template &lt;typename T&gt; Matrix&lt;T&gt; Matrix&lt;T&gt;::operator*(Matrix const&amp; obj) const
{
    Matrix tmp(*this); //erstellt neues 2D array, das die werte von this übernimmt

    Matrix Ergebnis(tmp.Y , obj.X); //erstellt X*Y Array, das mit 0 initialisiert ist

    for(size_t x=0;x!=Ergebnis.X;++x)
        for(size_t y=0;y!=Ergebnis.Y;++y) //spaltenweise durchgehen
            for(size_t a=0;a!=tmp.X;++a)
                 Ergebnis.pointer[x][y]+=(tmp.pointer[a][y]*obj.pointer[x][a]);
    return Ergebnis;
}
</code></pre>
<pre><code class="language-cpp">//*= Operator
template &lt;typename T&gt; Matrix&lt;T&gt;&amp; Matrix&lt;T&gt;::operator*=(Matrix const&amp; obj)
{
    Matrix tmp(*this);

    for(size_t x=0;x!=X;++x)
    {
        for(size_t y=0;y!=Y;++y)
        {
            pointer[x][y]=0;
            for(size_t a=0;a!=X;++a)
            {
                pointer[x][y]+=(tmp.pointer[a][y]*obj.pointer[x][a]);
            }
        }
    }
    return (*this);
}
</code></pre>
<p>Sieht jemand, woran das liegen könnte <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/237772/seltsames-verhalten-von-long-double-beim-und-operator</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 09:33:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237772.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Apr 2009 16:59:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 16:59:00 GMT]]></title><description><![CDATA[<p>Hallo, in meiner Matrixklasse habe ich zum Multiplizieren den * und *= Operator eingerichtet. Dabei gibt der * Operator die richtigen Werte aus, wohingegen der *= Operator extrem ungenau ist. zB. bei der Multiplikation der (long double) Matrix</p>
<pre><code>0.5 0.3 0.6
0.2 0.2 0.1
0.3 0.5 0.3
</code></pre>
<p>mit sich selbst, erhalte ich für das Element [0][0] der ErgebnisMatrix folgende werte:</p>
<pre><code>Erwarteter Wert:         0.49
Von * errechneter Wert:  0.489999999999999999 //O.K.
Von *= errechneter Wert: 0.500000000000000000 //Abweichung von
                                              //0.1
</code></pre>
<p>Die von *= ermittelten Werte weichen im Schnitt um 0.1 bis 0.2 vom richtigen Wert ab (was ja um ein vielfaches über dem zu erwartenden Rundungsfehler liegt). Dabei habe ich beide Opertoren (ungefähr) gleich implementiert (der Rechenweg kann also nicht Schuld sein):</p>
<pre><code class="language-cpp">//* Operator
template &lt;typename T&gt; Matrix&lt;T&gt; Matrix&lt;T&gt;::operator*(Matrix const&amp; obj) const
{
    Matrix tmp(*this); //erstellt neues 2D array, das die werte von this übernimmt

    Matrix Ergebnis(tmp.Y , obj.X); //erstellt X*Y Array, das mit 0 initialisiert ist

    for(size_t x=0;x!=Ergebnis.X;++x)
        for(size_t y=0;y!=Ergebnis.Y;++y) //spaltenweise durchgehen
            for(size_t a=0;a!=tmp.X;++a)
                 Ergebnis.pointer[x][y]+=(tmp.pointer[a][y]*obj.pointer[x][a]);
    return Ergebnis;
}
</code></pre>
<pre><code class="language-cpp">//*= Operator
template &lt;typename T&gt; Matrix&lt;T&gt;&amp; Matrix&lt;T&gt;::operator*=(Matrix const&amp; obj)
{
    Matrix tmp(*this);

    for(size_t x=0;x!=X;++x)
    {
        for(size_t y=0;y!=Y;++y)
        {
            pointer[x][y]=0;
            for(size_t a=0;a!=X;++a)
            {
                pointer[x][y]+=(tmp.pointer[a][y]*obj.pointer[x][a]);
            }
        }
    }
    return (*this);
}
</code></pre>
<p>Sieht jemand, woran das liegen könnte <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1689433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689433</guid><dc:creator><![CDATA[Mtrx]]></dc:creator><pubDate>Wed, 01 Apr 2009 16:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:21:43 GMT]]></title><description><![CDATA[<p>Geh am besten mit einem Debugger durch oder bau Ausgaben bei jedem Zwischenschritt ein. So kannst du beide Algorithmen 1:1 vergleichen.</p>
<p>Deine Vorgehensweise ist aber ziemlich inkonsistent. Warum implementierst du den <code>operator*</code> nicht über den <code>operator*=</code> ? Dann fällt auch die Codeduplizierung weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689446</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:26:09 GMT]]></title><description><![CDATA[<p>Jetzt versteh ich garnichts mehr. Ich habe jetzt den * Operator über *= implementiert.</p>
<pre><code class="language-cpp">template &lt;typename T&gt; Matrix&lt;T&gt; Matrix&lt;T&gt;::operator*(Matrix const&amp; obj) const
{
    Matrix tmp(*this);
    return tmp*=obj;
}
</code></pre>
<p>Trotzdem sind die Ergebnisse, die der * Operator liefert, wieder richtig, wohingegen die Ergebnisse des *= Operator die starke Abweichung aufweisen Oo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689447</guid><dc:creator><![CDATA[Mtrx]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:28:46 GMT]]></title><description><![CDATA[<p>Das kann nicht sein. Hast du die richtigen Objekte geprüft? Und hast du sie richtig geprüft?</p>
<p>Ansonsten wird es wohl Zeit für den Debugger...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689451</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:28:46 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:31:49 GMT]]></title><description><![CDATA[<p>Wie sieht Dein Kopierkonstrukor aus? Kopierst Du die Matrix tatsächlich?<br />
Dein Member pointer klingt so als wäre es er ein Pointer.</p>
<p>DJohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689454</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:31:49 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:34:52 GMT]]></title><description><![CDATA[<p>was meinst du mit Objekte geprüft?<br />
Also von der Implementierung her sehe ich keine Fehler</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class Matrix
{
   private:
    size_t X;
    size_t Y;
    T** pointer;

   public:
    Matrix(const Matrix&amp; obj);
    Matrix operator * (Matrix const&amp; obj) const;
    Matrix&amp; operator*=(Matrix const&amp; obj);
    ~Matrix();
};

template &lt;typename T&gt; Matrix&lt;T&gt;&amp; Matrix&lt;T&gt;::operator*=(Matrix const&amp; obj)
{
    Matrix tmp(*this);
    for(size_t x=0;x!=X;++x)
    {
        for(size_t y=0;y!=Y;++y)
        {
            pointer[x][y]=0;
            for(size_t a=0;a!=X;++a)
            {
                pointer[x][y]+=(tmp.pointer[a][y]*obj.pointer[x][a]);
            }
        }
    }
    return (*this);
}

template &lt;typename T&gt; Matrix&lt;T&gt; Matrix&lt;T&gt;::operator*(Matrix const&amp; obj) const
{
    Matrix tmp(*this);
    return tmp*=obj;
}

template &lt;typename T&gt; Matrix&lt;T&gt;::Matrix(const Matrix&amp; obj)
{
    X=obj.X;
    Y=obj.Y;

    pointer = new T*[X];
    for(size_t i=0;i!=X;++i)
        pointer[i] = new T[Y];

    for(size_t y=0;y!=Y;++y)
        for(size_t x=0;x!=X;++x)
            pointer[x][y]=obj.pointer[x][y];
}

template &lt;typename T&gt; Matrix&lt;T&gt;::~Matrix()
{
    for(size_t i=0;i!=X;++i)
        delete [] pointer[i];
    delete [] pointer;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1689456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689456</guid><dc:creator><![CDATA[Mtrx]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:34:52 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:56:04 GMT]]></title><description><![CDATA[<p>Und der Zuweisungsoperator? Und wie initialisierst du die Werte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689467</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:55:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt; Matrix&lt;T&gt;&amp; Matrix&lt;T&gt;::operator = (const Matrix&amp; obj)
{
    for(size_t i=0;i!=X;++i)
        delete [] pointer[i];
    delete [] pointer;

    X=obj.X;
    Y=obj.Y;

    pointer = new T*[X]; //zeiger auf array aus zeigern
    for(size_t i=0;i!=X;++i)
        pointer[i] = new T[Y];

    for(size_t y=0;y!=Y;++y)
        for(size_t x=0;x!=X;++x)
            pointer[x][y]=obj.pointer[x][y];

    return (*this);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1689469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689469</guid><dc:creator><![CDATA[Mtrx]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:55:23 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 17:57:19 GMT]]></title><description><![CDATA[<p>Es scheint mir merkwürdig, dass die Werte nach beiden Operationen nur knapp voneinander abweichen. Bei einer fehlerhaften Zuweisung sieht es meist schlimmer aus...</p>
<p>Mtrx, du willst dich wohl aus Prinzip nicht mit dem Debugger anfreunden? Ich würds dir aber raten. Der kann dir in Zukunft sehr, sehr hilfreich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689471</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:57:19 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 18:01:32 GMT]]></title><description><![CDATA[<p>Bin halt noch neu bei C++ und hab noch nie mit dem Debugger gearbeitet. Aber wird wohl Zeit, dass ich das auch mal lerne ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689475</guid><dc:creator><![CDATA[Mtrx]]></dc:creator><pubDate>Wed, 01 Apr 2009 18:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 18:04:56 GMT]]></title><description><![CDATA[<p>Wirklich. Du wirst den Debugger schon noch zu schätzen lernen. <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>Aber für den Anfang reichen auch Konsolenausgaben. Gib die Zwischenresultate mit <code>std::cout</code> aus und schau, ab wo Abweichungen auftreten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689477</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 01 Apr 2009 18:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames verhalten von (long) double beim * und *= Operator on Wed, 01 Apr 2009 18:07:21 GMT]]></title><description><![CDATA[<p>Schande über mein Haupt! Der &quot;Fehler&quot; hatte nichts mit dem Quellcode zu tun sondern mit einer falschen Zuweisung im main() part Oo Jetzt funktioniert alles wunderbar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689478</guid><dc:creator><![CDATA[Mtrx]]></dc:creator><pubDate>Wed, 01 Apr 2009 18:07:21 GMT</pubDate></item></channel></rss>