Double aus Datei auslesen - Wert nicht ganz richtig



  • Hallo,

    ich habe folgendermassen versucht, aus einer Datei einen Double-Wert zu lesen:

    void MapModel::loadMapFile(char* fileName)
    {
    
      ifstream mapFile(fileName);
      if ( mapFile.is_open() != true ) {
        cerr << "Die Datei konnte nicht geöffnet werden." 
    	 << endl;
      }  
      char buffer[512];
      mapFile.getline( buffer, sizeof(buffer) );
      double mydouble = atof( buffer );
    

    Nun habe ich das Problem, dass in mydouble nicht genau der Wert steht, wie er in der Datei zu finden ist:
    Datei: 9.78555
    Ausgabe von mydouble: 9.7855500000000006

    Liegt es daran, dass atof in einen Float umwandelt und dann falsch gerundet wird? Wie kann ich diesen Fehler beheben?

    Dankeschoen,
    Andy



  • dass ist die normale double (bzw float) ungenauigkeit...

    damit musst du rechnen, ist halt das doofe an computern...

    ich hatte mal den fall dass ich eine double zahl einfach nur + 1.0 null (und das merhmals hintereinadner in ner shcleife) gerechnet hab und da hat sich am ende immer ein/zweit zahlen verändert...



  • Deswegen sollte man es auch vermeiden Fließkommazahlen auf Gleichheit zu prüfen. Meist ist es am besten mit Toleranzen zu arbeiten.



  • sunnyandy schrieb:

    if ( mapFile.is_open() != true ) {
    

    WTF?!



  • Konrad Rudolph schrieb:

    WTF?!

    Y WTF? FWIW, das ist nur nebensache.UAAFF...



  • Danke fuer eure Kommentare.
    Das liegt wohl an der Mantisse fuer die Gleitkommadarstellung oder?

    Wie macht man es denn sonst, wenn man einen ziemlich genauen Wert einlesen moechte?
    Kann ich die Werte nicht als ganze Zahlen einlesen und dann das Komma verschieben oder bringt das keinen Effekt?



  • sunnyandy schrieb:

    Danke fuer eure Kommentare.
    Das liegt wohl an der Mantisse fuer die Gleitkommadarstellung oder?

    nein, das liegt daran, dass die Zahl aus der Datei im Zehnersystem und im Computer im Binärsystem angegeben ist. Und man kann im allgemeinen Fall eine Dezimalzahl nicht in eine endliche binäre Form umwandeln. Da nützt auch kein long double oder super long double - selbst wenn die Mantisse so lang wäre wie der gesamte Speicher aller Rechner dieser Welt, kann damit der Wert 9,78555 nicht exakt binär abgebildet werden.

    sunnyandy schrieb:

    Wie macht man es denn sonst, wenn man einen ziemlich genauen Wert einlesen moechte?
    Kann ich die Werte nicht als ganze Zahlen einlesen und dann das Komma verschieben oder bringt das keinen Effekt?

    Nein, bringt nichts wie oben beschrieben.

    9,7855500000000006 gegenüber 9,78555 ist ziemlich genau.

    Das Einlesen geht auch einfach mit 'mapFile >> mydouble' etwa so:

    void MapModel::loadMapFile(char* fileName)
    {
    
      ifstream mapFile(fileName);
      if ( mapFile.is_open() != true ) {
        cerr << "Die Datei konnte nicht geöffnet werden."
         << endl;
      }  
      double mydouble;
      if( mapFile >> mydouble )
        cout << "Gelesen: " << mydouble << endl;
    

    Gruß
    Werner


Anmelden zum Antworten