The Incredible Fufialk Geschrieben 14. April 2005 Geschrieben 14. April 2005 Hallo, sagt mal gibt es auch eine eine Funktion analog zu atof? Ich habe Zeitstempel in Sekunden seit 1.1.1970 und will diese ins Windowsformat übertragen. Ganz simpel und einfach von Hand ausrechnen: Der Code an der Stelle sieht so aus: int timea; float timestampa; ofl.setf(ios::fixed); ofl.setprecision(5) timestampa = Tabi.timea / 86400 + 25569 + 3600; Der erste Zeitstempel hat den int Wert 1'113'325'003 Das wäre das berechnete Ergebnis: 38453,95834 Ich erhalte aber: 42053.00000 Sieht jemand meinen Denkfehler? Vielen Dank. Zitieren
Klotzkopp Geschrieben 14. April 2005 Geschrieben 14. April 2005 1113325003 / 86400 + 25569 + 3600 ist bei mir etwa 42054,7. Wenn man berücksichtigt, dass du da eine Integerdivision machst, 42054. Keine Ahnung, wie du auf 38453,95834 kommst. Deine Formel verstehe ich auch nicht. Was du mit "Windowsformat" meinst, ist auch unklar. Zitieren
The Incredible Fufialk Geschrieben 15. April 2005 Autor Geschrieben 15. April 2005 Ok, da habe ich selber einen kleinen Fehler gemacht, und die 3600 vergessen zu addieren. Mit Windowsformat meine ich, dass es zum Beispiel in Excel die Möglichkeit gibt, eine Spalte als Datum zu definieren. Stellt man dann die Ansicht um auf Standart bkommt man eine Zahl die ungefähr so aussieht, wie ich sagte, also der heutige Tag 14:30 Uhr bekäme den Wert: 38457,6041666667 Das ganze nennt sich glaub ich Pivot Jahr Und berechnet sich aus der Zeit, die Seit dem 01.01.1900 0:00 Uhr vergangen ist. Daher auch meine Formel, die ich an dieser Stelle mal berichtige. (Tabi.timea + 3600) / 86400 + 25569 Tab.timea = Das Datum in Sekunden seit dem 1.1.1970 + 3600 = Eine Stunde kommt dazu da wir Sommerzeit haben / 86400 = Sekunden pro Tag Das ergebnis sind also Tage... + 25569 = Am Ende kommen noch die Tage hinzu, zwischen dem 1.1.1900 und dem 1.1.1970 liegen. Aber so weit wollte ich gar nicht gehen, sondern einfach wissen, wie ich die Nachkommastellen korrekt angezeigt bekomme. Danke und schönes WE. Zitieren
Klotzkopp Geschrieben 15. April 2005 Geschrieben 15. April 2005 Aber so weit wollte ich gar nicht gehen, sondern einfach wissen, wie ich die Nachkommastellen korrekt angezeigt bekomme. Ach so. Ganz einfach: setprecision zählt alle Stellen, nicht nur die Nachkommastellen. Bei einer Zahl >= 10000 siehst du also mit setprecision(5) keine Nachkommastellen. Übrigens: Falls du MFC benutzen kannst, wäre COleDateTime vielleicht etwas für dich. Zitieren
The Incredible Fufialk Geschrieben 15. April 2005 Autor Geschrieben 15. April 2005 Hab ich auch schon dran gedacht. Aber ich erhalte trotzdem keine Nachkommastellen, sonder immer nur ,00000. Aber die Sind ja grade wichtig, weil das die Sekunden sind. Zitieren
Klotzkopp Geschrieben 15. April 2005 Geschrieben 15. April 2005 Aber ich erhalte trotzdem keine Nachkommastellen, sonder immer nur ,00000. Und das ist auch richtig so. Ich hab doch gerade erklärt, wieso. :confused: setprecision "sieht" 5 Stellen vor dem Komma, als hört's da auf mit der Darstellung. Wenn du noch Nachkommastellen dazu willst, solltest du einen höheren Wert als 5 angeben. Nur nochmal als Tipp: time_t t = time(0); COleDateTime odt(t); DATE d = odt.m_dt;[/CODE] Zitieren
The Incredible Fufialk Geschrieben 15. April 2005 Autor Geschrieben 15. April 2005 Ich glaube da haben wir gerade aneinander vorbei geredet. Selbst wen ich setprecision auf zehn setze (für fünf Stellen vor und fünf Stellen hinter dem Komma), werden die Nachkommastellen nicht berechnet! Sondern als nullen angegeben. Die Sache mit dem Datum ist ja ganz nett, aber für mich nicht interessant. Ich brauche das PivotJahr, da ich die Ergebnisse an MatLab übergebe, und dort schon alles darauf eingestellt ist. Das wäre dann doppelter Aufwand. Zitieren
The Incredible Fufialk Geschrieben 15. April 2005 Autor Geschrieben 15. April 2005 setprecision "sieht" 5 Stellen vor dem Komma, als hört's da auf mit der Darstellung. Wenn du noch Nachkommastellen dazu willst, solltest du einen höheren Wert als 5 angeben. Das ist leider nicht ganz richtig. Wenn man nämlich ios::fixed verwendet, was auf alle Fälle den Punkt anzeigt, steht setprecision für die Zahl der Stellen nach dem Komma. Siehe: #include <iostream.h> // cin, cout #include <conio.h> // getch #include <iomanip.h> // setprecision int main() { int i = 1113325003; float E; E = (i+3600)/86400+25569; cout << "Datum in Pivot = " << setprecision(10) << fixed << E; getch(); } Zitieren
Klotzkopp Geschrieben 15. April 2005 Geschrieben 15. April 2005 Wenn man berücksichtigt, dass du da eine Integerdivision machst [...]Wandle mindestens einen an der Division beteiligten Wert in double um, bevor du dividierst. Zitieren
The Incredible Fufialk Geschrieben 15. April 2005 Autor Geschrieben 15. April 2005 Mit double als Zwischenschritt klappt es. Vielen Dank. Weißt Du, woher der Rundungsfehler resultiert? Mit dem Taschenrechner bekomme ich : 38454,74772 = 12.04.2005 17:56:43 Mit dem Programm : 38454,74609 = 12.04.2005 17:54:22 Also eine Abweichung von 2 Minuten. #include <iostream.h> // cin, cout #include <conio.h> // getch #include <iomanip.h> // setprecision int main() { int i = 1113325003; double e; e = i; float E; E = (e+3600)/86400+25569; cout << "Datum in float = " << setprecision(5) << fixed << e; cout << "\nDatum in Pivot = " << setprecision(5) << fixed << E; getch(); } Zitieren
The Incredible Fufialk Geschrieben 15. April 2005 Autor Geschrieben 15. April 2005 Schon gut, jetzt fiel es mir wie Schuppen von den Augen. Ich lasse float ganz weg und nehme double für das Ergebnis. Dann stimmen die stellen auch. Weißt Du trotzdem wo der Unterschied herrührt? Zitieren
Klotzkopp Geschrieben 15. April 2005 Geschrieben 15. April 2005 float hat nur 7 Stellen Genauigkeit, dieser Datentyp ist mit solchen Werten schlicht überfordert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.