17 stellige Fließkommazahlen addieren in C++

Hilikus

Enthusiast
Thread Starter
Mitglied seit
05.04.2005
Beiträge
3.413
Hallo zusammen.

ich habe nochmal ein kleines Problem in C++

Hier mal der betreffende Code Ausschnitt:

Code:
long double time_numerisch = capzeit.tstamp.sec + d3;
	cout << capzeit.tstamp.sec << "\t" << d3 << "\t" << time_numerisch << endl;
	//cout << time_numerisch << endl;
	rawfile <<"\t"<< time_numerisch;

Ich möchte eine Zahl time_numerisch, die eine Summe aus capzeit.tstamp.sec und d3 ist.
capzeit.tstamp.sec ist die Unix Time Sekundengenau
d3 sind die Nachkommastellen.

Die cout Ausgabe liefert aber folgendes:
Code:
1289232881      0.7765445       1.289233e+09
Also sowohl captzeit.tstamp.sec als auch d3 werden korrekt ausgegeben, die Summe der beiden ist aber viel zu ungenau.
Ich brauche schon alle Nachkommastellen, also in dieser Form: 1289232881.7765445

Ich hab gedacht long double sei das genauste?
Bzw. wo ist der Wurm drin?

Grüße
hilikustue
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Stimmt doch. Es wird zur Darstellung nur das Komma um 9 Stellen nach links verschoben und die Ausgabe erfolgt in Exponentialschreibweise, d.h. die e+09 zeigt, dass das Komma um 9 Stellen nach rechts verschoben werden muss.
In C konnte die Ausgabe z.B. durch %x.ylf angegeben werden, wobei x für die Anzahl anzuzeigender Vorkomma- und y die Anzahl anzuzeigender Nachkommastellen steht. Sowas müsstest du nun in C++ machen und siehst die richtige Zahl.
 
Stimmt doch. Es wird zur Darstellung nur das Komma um 9 Stellen nach links verschoben und die Ausgabe erfolgt in Exponentialschreibweise, d.h. die e+09 zeigt, dass das Komma um 9 Stellen nach rechts verschoben werden muss.
In C konnte die Ausgabe z.B. durch %x.ylf angegeben werden, wobei x für die Anzahl anzuzeigender Vorkomma- und y die Anzahl anzuzeigender Nachkommastellen steht. Sowas müsstest du nun in C++ machen und siehst die richtige Zahl.

Ja, das mag sein. Wenn er es aber nicht ausschreibt, hilft es mir nichts (wegen Weiterverabeitung).

Wo muss ich das hinsetzen in den Code, das du gepostet hast?

Gruß
 
Na in das cout. Musst du mal suchen, ob man da Parameter angeben kann, um ein bestimmtes Ausgabeformat (eben Anzeige aller Vor- und Nachkommazahlen) zu erzwingen.

p.s. du kannst damit doch weiter arbeiten. Nur die Darstellung wurde so angepasst.
 
Das Problem ist, ich arbeite mit der geschriebenen ASCI Datei weiter. Und wenn da 1,1085 E9 drinsteht, dann ist die Genauigkeit meiner Zahl eben nur noch bei 100000 und nicht 7 Nachkommastellen.
Aber hat sich auch erledigt, war nur als workaround gedacht und ich habe das Problem mit meiner Auswertungssoftware in den Griff bekommen, so dass ich die Zahl nicht mehr brauche.
 
Die Lösung dazu wäre ein IO-Operator gewesen, den du in dein cout "schiebst".

cout << capzeit.tstamp.sec << "\t" << d3 << "\t" << setprecision(15) << time_numerisch << endl;

Würde dir 15 Nachkommastellen ausgeben. Siehe auch C++ Notes: I/O Manipulators

Gruß
 
Der Thread ist ja schon etwas älter, aber da er nun schon mal ausgegraben ist...

Das Problem ist nicht die Anzahl der Nachkommastellen, sondern die Verwendung von Fließkommazahlen für die Berechnung von Zeiten, die einen absoluten Bezugszeitpunkt haben, wie den 1.1.1970 Unix. Sowas rechnet man nahezu immer besser mit Festkommazahlen, also Integertypen, denen man einfach einen fixen Faktor andefiniert. z.B. kann man mit einem 64 Bit Integer die Nanosekunden über einen Zeitraum von +/- 300 Jahren zählen. Das ist dann in diesem Zeitbereich genauer und vor allem auch bezüglich der Genauigkeit erwartungstreuer als die Verwendung von 80 Bit Fließkommazahlen, bekommt allerdings zwangsläufig irgendwann ein Überlaufproblem, in diesem Beispiel also irgendwann um das Jahr 2250.
 
OK, den Code diesbezüglich angeschaut habe ich mir nicht, aber recht hast du.
Zumal die Fließkommaarithmetrik nach mehreren Operationen die Genauigkeit dann verschlechtert...
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh