<?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[Problem mit printf() bzw. cout bei double oder long double]]></title><description><![CDATA[<p>Folgender Quelltext liefert nur beim Datentyp float die richtige Ausgabe, d.h. der Betrag des jeweiligen Vektors (Vektor-Objekt) wird nur mit float anstelle von double bzw. long double korrekt ermittelt.<br />
(Hinweis: Der Quelltext ist auf das Wesentliche gekürzt wiedergegeben. X- und Y-Werte für p[i] werden aus einer Datei, die n Linien mit Anfangs- und Endpunkt enthält, in x[] und y[] eingelesen.)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;      // für sqrtl und powl

using namespace std;

class point_2d              // 2-D-Punkt
{
      public:
      long double x, y;     // x und y Koordinate für Punkt P

      point_2d()            // Standardkonstruktor
      {
       x = 0; 
       y = 0;
      }
};

class vektor                  // Linie zwischen zwei Punkten als mathematischer Vektor
{
      public:
      point_2d a, e;        // Anfangs- (a) und Endpunkt (e) der Linie

      long double betrag;        

      void set_betrag()
      {
       betrag = sqrtl(pow((a.x-e.x),2)*pow((a.y-e.y),2));
      //betrag = sqrt((a.x-e.x)*(a.x-e.x) + (a.y-e.y)*(a.y-e.y));
      } 

      vektor() {betrag = 0;}                               // Standardkonstruktor                 
};

int main ()
{
    int i, j, n, iret;
    n = anzahl_linie(); 

    long double *x = new long double[2*n+1];      // Vektor für x- und y-Koordinaten der End- und Anfangspunkte dynamisch allokieren      
    long double *y = new long double[2*n+1];   // n Linien =&gt; 2*n Koordinatenpaare (+1, da Zähler ab 1)
    point_2d *p = new point_2d[2*n+1];           // Objekt-Vektor aus 2*n Punkten dynamisch erzeugen zum Speichern der Anfangs- und Endpunkte
    vektor *v = new vektor[n+1];   // Objekt-Vektor aus n Linien dynamisch erzeugen (auf den Heap)

    iret = dxf_read(x, y, n);                                       // Koordinaten in x[] und y[] einlesen
    if(iret!= 0)
    printf(&quot;Funktion dxf_read fehlgeschlagen!!!\n\n&quot;);  

    p[0].x = 0;                                  //erstes Element 0, da Zähler ab 1
    p[0].y = 0;                                 

    for(i=1; i&lt;=2*n; i++)
    {
    p[i].x = x[i];                            // Umspeichern der eingelesenen Koordinaten in Punkt-Vektor
    p[i].y = y[i];                           
    }

    for(i=1, j=1; i&lt;=n; i++)             // Punkte zu den Anfangs- und Endpunkten der Linien zuordnen
    {
    v[i].a = p[j];
    v[i].e = p[j+1];
    v[i].set_betrag();
    j=j+2;
    } 

    for(i=1; i&lt;=n; i++)  
    {

    printf(&quot;%Lg&quot;, v[i].a.x);
    printf(&quot;%\t%Lg\n&quot;,v[i].a.y);
    printf(&quot;%Lg&quot;, v[i].e.x);
    printf(&quot;%\t%Lg\n&quot;,v[i].e.y);
    printf(&quot;Betrag: %Lg\n\n&quot;, v[i].betrag);
    }
    cin.get();

    delete[] x;
    delete[] y; 
    delete[] p;
    delete[] v; 

    return 0;
}
</code></pre>
<p>Standardausgabe: (falscher Betrag!)</p>
<p>11.216 6.6617<br />
16.216 6.6617<br />
Betrag: 0</p>
<p>16.216 6.6617<br />
16.216 16.6617<br />
Betrag: 0</p>
<p>23.216 16.6617<br />
16.216 16.6617<br />
Betrag: 0</p>
<p>23.216 16.6617<br />
23.216 21.6617<br />
Betrag: 0</p>
<p>23.216 21.6617<br />
11.216 21.6617<br />
Betrag: 0</p>
<p>11.216 6.6617<br />
11.216 16.6617<br />
Betrag: 0</p>
<p>11.216 16.6617<br />
11.216 21.6617<br />
Betrag: 0</p>
<p>11.216 21.6617<br />
16.216 16.6617<br />
Betrag: 0</p>
<p>Bei Verwendung des Datentyps float dagegen erhält man die richtige Ausgabe für &quot;betrag&quot;. Wird außerdem anstelle von printf() cout verwendet, werden auch sämtliche Koordinaten mit &quot;0&quot; ausgegeben.<br />
Möglicherweise liegt das Problem in der Verwendung von printf() und cout.</p>
<p>IDE: Bloodshed Dev C++ V 4.9.9.2</p>
<p>Vielen Dank für alle Denkanstösse.</p>
<p>&lt;edit&gt;Bitte Code-Tags verwenden&lt;/edit&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136054/problem-mit-printf-bzw-cout-bei-double-oder-long-double</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 07:22:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136054.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Feb 2006 22:30:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit printf() bzw. cout bei double oder long double on Tue, 07 Feb 2006 08:45:07 GMT]]></title><description><![CDATA[<p>Folgender Quelltext liefert nur beim Datentyp float die richtige Ausgabe, d.h. der Betrag des jeweiligen Vektors (Vektor-Objekt) wird nur mit float anstelle von double bzw. long double korrekt ermittelt.<br />
(Hinweis: Der Quelltext ist auf das Wesentliche gekürzt wiedergegeben. X- und Y-Werte für p[i] werden aus einer Datei, die n Linien mit Anfangs- und Endpunkt enthält, in x[] und y[] eingelesen.)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;      // für sqrtl und powl

using namespace std;

class point_2d              // 2-D-Punkt
{
      public:
      long double x, y;     // x und y Koordinate für Punkt P

      point_2d()            // Standardkonstruktor
      {
       x = 0; 
       y = 0;
      }
};

class vektor                  // Linie zwischen zwei Punkten als mathematischer Vektor
{
      public:
      point_2d a, e;        // Anfangs- (a) und Endpunkt (e) der Linie

      long double betrag;        

      void set_betrag()
      {
       betrag = sqrtl(pow((a.x-e.x),2)*pow((a.y-e.y),2));
      //betrag = sqrt((a.x-e.x)*(a.x-e.x) + (a.y-e.y)*(a.y-e.y));
      } 

      vektor() {betrag = 0;}                               // Standardkonstruktor                 
};

int main ()
{
    int i, j, n, iret;
    n = anzahl_linie(); 

    long double *x = new long double[2*n+1];      // Vektor für x- und y-Koordinaten der End- und Anfangspunkte dynamisch allokieren      
    long double *y = new long double[2*n+1];   // n Linien =&gt; 2*n Koordinatenpaare (+1, da Zähler ab 1)
    point_2d *p = new point_2d[2*n+1];           // Objekt-Vektor aus 2*n Punkten dynamisch erzeugen zum Speichern der Anfangs- und Endpunkte
    vektor *v = new vektor[n+1];   // Objekt-Vektor aus n Linien dynamisch erzeugen (auf den Heap)

    iret = dxf_read(x, y, n);                                       // Koordinaten in x[] und y[] einlesen
    if(iret!= 0)
    printf(&quot;Funktion dxf_read fehlgeschlagen!!!\n\n&quot;);  

    p[0].x = 0;                                  //erstes Element 0, da Zähler ab 1
    p[0].y = 0;                                 

    for(i=1; i&lt;=2*n; i++)
    {
    p[i].x = x[i];                            // Umspeichern der eingelesenen Koordinaten in Punkt-Vektor
    p[i].y = y[i];                           
    }

    for(i=1, j=1; i&lt;=n; i++)             // Punkte zu den Anfangs- und Endpunkten der Linien zuordnen
    {
    v[i].a = p[j];
    v[i].e = p[j+1];
    v[i].set_betrag();
    j=j+2;
    } 

    for(i=1; i&lt;=n; i++)  
    {

    printf(&quot;%Lg&quot;, v[i].a.x);
    printf(&quot;%\t%Lg\n&quot;,v[i].a.y);
    printf(&quot;%Lg&quot;, v[i].e.x);
    printf(&quot;%\t%Lg\n&quot;,v[i].e.y);
    printf(&quot;Betrag: %Lg\n\n&quot;, v[i].betrag);
    }
    cin.get();

    delete[] x;
    delete[] y; 
    delete[] p;
    delete[] v; 

    return 0;
}
</code></pre>
<p>Standardausgabe: (falscher Betrag!)</p>
<p>11.216 6.6617<br />
16.216 6.6617<br />
Betrag: 0</p>
<p>16.216 6.6617<br />
16.216 16.6617<br />
Betrag: 0</p>
<p>23.216 16.6617<br />
16.216 16.6617<br />
Betrag: 0</p>
<p>23.216 16.6617<br />
23.216 21.6617<br />
Betrag: 0</p>
<p>23.216 21.6617<br />
11.216 21.6617<br />
Betrag: 0</p>
<p>11.216 6.6617<br />
11.216 16.6617<br />
Betrag: 0</p>
<p>11.216 16.6617<br />
11.216 21.6617<br />
Betrag: 0</p>
<p>11.216 21.6617<br />
16.216 16.6617<br />
Betrag: 0</p>
<p>Bei Verwendung des Datentyps float dagegen erhält man die richtige Ausgabe für &quot;betrag&quot;. Wird außerdem anstelle von printf() cout verwendet, werden auch sämtliche Koordinaten mit &quot;0&quot; ausgegeben.<br />
Möglicherweise liegt das Problem in der Verwendung von printf() und cout.</p>
<p>IDE: Bloodshed Dev C++ V 4.9.9.2</p>
<p>Vielen Dank für alle Denkanstösse.</p>
<p>&lt;edit&gt;Bitte Code-Tags verwenden&lt;/edit&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/988125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/988125</guid><dc:creator><![CDATA[chuck]]></dc:creator><pubDate>Tue, 07 Feb 2006 08:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit printf() bzw. cout bei double oder long double on Tue, 07 Feb 2006 07:17:09 GMT]]></title><description><![CDATA[<p>Erstens sind cpp-Tags eine nützliche Erfindung.</p>
<p>Zweitens ist deine Betrags-Funktion falsch - der Betrag eines Vektors ist sqrt(a²**+**b²), nicht sqrt(a²*b²).</p>
<p>Und drittens solltest du wirklich die C++-Möglichkeiten ausnutzen (das geht los bei Ein-Ausgabe über iostreams bis hin zur Verwendung von STL-Containern)</p>
<p>PS: Und wenn du wirklich mit printf() arbeiten willst, binde auch den Header &lt;cstdio&gt; ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/988178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/988178</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 07 Feb 2006 07:17:09 GMT</pubDate></item></channel></rss>