Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit printf() bzw. cout bei double oder long double

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.02.2006, 23:39 Uhr
~chuck
Gast


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

C++:
#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(powl((a.x-e.x),2)*powl((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++)                 // Ausgabe
    {

    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!)

Code:
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 dagegen erhält man die richtige Ausgabe für "betrag". Wird 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.

mod edit: benutze die Board Tags selber!

Dieser Post wurde am 06.02.2006 um 23:40 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.02.2006, 08:24 Uhr
ao

(Operator)


Die Formel in set_betrag ist falsch, in der Wurzel-Klammer muss ein + stehen, kein *.

Im Übrigen ist es keine gute Idee, zusätzlich zu Anfangs- und Endpunkt noch den Betrag des Vektors zu speichern. Durch A und E ist der Vektor vollständig beschrieben; jede Zusatzinformation birgt die Gefahr von Widersprüchen oder Fehlern.
Schreib besser eine Funktion get_betrag, die aus den Punkten den Betrag errechnet.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: