genauigkeit von float bei cout << some_float;



  • Hi Zusammen,

    ich bekomme von einem anderen Programm Zeitstempel in Sekunden als float.

    Wenn ich diese mit printf("%f",timestamp) ausgebe, bekomme ich

    426599.625000

    Wenn ich genau die gleiche Zahl mit cout << timestamp ausgebe bekomme dagegen:

    426600

    Nun meine Fragen:

    1. wie bekomme ich heraus, ob die erste Variante die genauste ist (sind da noch mehr Stellen?), ich brauche die Zahlen so genau wie möglich

    2. Warum gibt cout << die Zahl so ungenau aus? Ich muss diese Zahlen in eine Datei speichern (im Textformat) und benutze dafür den Stream in eine Datei, leider sind dort auch die Zahlen abgeschnitten. Wie kann ich das beheben, ohne die Daten binär speichern zu müssen?

    Schöne Grüße

    Beechen



  • Hallo,

    1. Warum gibt cout << die Zahl so ungenau aus? Ich muss diese Zahlen in eine Datei speichern (im Textformat) und benutze dafür den Stream in eine Datei, leider sind dort auch die Zahlen abgeschnitten. Wie kann ich das beheben, ohne die Daten binär speichern zu müssen?

    Das liegt am Datentyp float, der eine Genauigkeit von 6-Dezimalstellen besitzt. D.h. wenn Zahlen sich erst nach der 6 Stelle unterscheiden, werden diese nicht unterschiedlich gespeichert.

    Nimm statt float double (15 Stellen genau) oder long double (19 Stellen genau).

    Caipi



  • Sorry, verklickt.

    Caipi



  • Du könntest dich eines Manipulators bedienen.

    cout << fixed << zahl1;
    

    Ich würde aber davon abraten, Zeitangaben in Fließkommazahlen anzugeben, da wie Caipa eben sagt, mit größer werdener Zahl die Genauigkeit abnimmt.

    Wie wärs stattdessen mit long für Millisekunden seit Datum x?
    oder _int64?



  • @caipi: leider kann ich nicht beeinflussen, wieviel Bits mir das Programm schickt, das ist sozusagen in der Spezifikation festgelegt und damit in Stein gemeißelt.

    Ok für cout habe ich folgende Lösung in meiner C++Bibel gefunden:

    cout.setf(ios_base::fixed);
    cout << timestamp;
    

    Meine Frage ist nun: Wenn ich eine Datei voll mit solchen Werten habe, und sie mit datei >> timestamp wieder einlese, muss ich dann dann auch vorher mit setf() das Format festlegen, oder erkennt der Stream automatisch die Nachkommastellen?



  • SeppSchrot schrieb:

    Du könntest dich eines Manipulators bedienen.

    cout << fixed << zahl1;
    

    Ich würde aber davon abraten, Zeitangaben in Fließkommazahlen anzugeben, da wie Caipa eben sagt, mit größer werdener Zahl die Genauigkeit abnimmt.

    Wie wärs stattdessen mit long für Millisekunden seit Datum x?
    oder _int64?

    Ok deine Variante gefällt mir noch besser als meine, aber muss ich beim Auslesen aus dem Stream jetzt auch sowas wie datei >> fixed >> zahl; machen, oder erkennt der Stream das von sich aus?

    Zu den Timestamps: die kommen von einer Hardware, die nunmal die Zeit in Sekunden verschickt, ich finds auch unüblich, aber gegen Hardware kommt man nunmal nicht an 😉


Anmelden zum Antworten