Problem mit printf() bzw. cout bei double oder long double



  • 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.
    (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.)

    #include <iostream>
    #include <cmath>      // 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 => 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("Funktion dxf_read fehlgeschlagen!!!\n\n");  
    
        p[0].x = 0;                                  //erstes Element 0, da Zähler ab 1
        p[0].y = 0;                                 
    
        for(i=1; i<=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<=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<=n; i++)  
        {
    
        printf("%Lg", v[i].a.x);
        printf("%\t%Lg\n",v[i].a.y);
        printf("%Lg", v[i].e.x);
        printf("%\t%Lg\n",v[i].e.y);
        printf("Betrag: %Lg\n\n", v[i].betrag);
        }
        cin.get();
    
        delete[] x;
        delete[] y; 
        delete[] p;
        delete[] v; 
    
        return 0;
    }
    

    Standardausgabe: (falscher Betrag!)

    11.216 6.6617
    16.216 6.6617
    Betrag: 0

    16.216 6.6617
    16.216 16.6617
    Betrag: 0

    23.216 16.6617
    16.216 16.6617
    Betrag: 0

    23.216 16.6617
    23.216 21.6617
    Betrag: 0

    23.216 21.6617
    11.216 21.6617
    Betrag: 0

    11.216 6.6617
    11.216 16.6617
    Betrag: 0

    11.216 16.6617
    11.216 21.6617
    Betrag: 0

    11.216 21.6617
    16.216 16.6617
    Betrag: 0

    Bei Verwendung des Datentyps float dagegen erhält man die richtige Ausgabe für "betrag". Wird außerdem anstelle von printf() cout verwendet, werden auch sämtliche Koordinaten mit "0" ausgegeben.
    Möglicherweise liegt das Problem in der Verwendung von printf() und cout.

    IDE: Bloodshed Dev C++ V 4.9.9.2

    Vielen Dank für alle Denkanstösse.

    <edit>Bitte Code-Tags verwenden</edit>



  • Erstens sind cpp-Tags eine nützliche Erfindung.

    Zweitens ist deine Betrags-Funktion falsch - der Betrag eines Vektors ist sqrt(a²**+**b²), nicht sqrt(a²*b²).

    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)

    PS: Und wenn du wirklich mit printf() arbeiten willst, binde auch den Header <cstdio> ein.


Anmelden zum Antworten