[C]- double möglichst genau ausgeben

Hallo,

ich möchte DOUBLE -Zahlen möglichst genau und gleich ausgeben.

Grundsätzlich nichts neues allerdings habe ich keine passende Lösung für folgendes Problem:

Ich möchte während mein Programm läuft permanent wichtige Zahlen "sichern".
Dazu schreibe ich die Zahl in eine extra Datei.
Ich möchte immer nur eine Zahl (pro Schleifendurchlauf) von bspw. 1000 Werten in der Datei verändert.
Mit fseek() versetze ich den schreib/lese pointer immer an die richtige Stelle um die jeweilig neue Zahl über die Alter zu schreiben.
(Es handelt sich um ein Histogramm in dem ich für einen bestimmten x-Wert den y-Wert überschreibe).

Um mit fseek() auch an der richtigen Stelle anzkommen muss ich genau wissen wie groß jede Zahl ist.
In der formatierten Ausgabe fprintf(fp, "%15.14e",variable) kann ich sozusagen die genaue Länge einstellen.

Nun brauch ich IMMER EXAKT die gleiche Größe für jede Zahl damit fseek den Pointer nicht falsch setzt.


Mein Problem ist nun bei der formatierten Ausgabe fprintf(,"****?",):

Mantisse:
Bei dem Datentyp DOUBLE ist die Mantisse 15-stellig das habe ich hoffentlich mit dem "%15.14e" abgedeckt. Ist es somit möglich immer alle Stellen der Mantisse zu erhalten ?
(Die Mantisse soll normiert sein mit 1. bis 9. gehen und ab 10 wird der Exponent angeglichen.)

Exponent
Bei dem "e" für wissenschaftliche Notation variiert die Länge des Exponenten!
Bsp: 1.867570e-86 .......... 6.657811e-182
Kann man das "feststellen"?

Vorzeichen
Vorzeichen erhöhen die geprintete Zahl um 1
Bsp: -2.114797262475e-01 ...... 2.114797262475e-01
Gibt es da einen Ausdruck der einen Platzhalter einfügt für ein "+"

--------------------------------------------------------------
Eine Lösung wäre alles von "Hand" in Binär umzuwandeln aber dafür benötigt man wieder allerhand
Operationen. Möchte gern so wenig wie möglich Zeit für das Schreiben verbrauchen.

Gruß
LM
 
Mir ist gerade eine Lösung eingefallen:
Für den Fall das eine Zahl von Minus zu Plus wechselt wird das + nichtmehr mit ausgegeben und die Zahl ist kürzer um ein Byte für das auslesen mit fseek.

Lösung ist einfach vorher ein leeres Files erstellen was bspw. 40 Leerzeichen pro Zeile hat. Dann kann man überschreiben und kann trotzdem sagen nach einer Verschiebung von 40 Byte mit fseek bin ich wieder an einem Zeilenanfang.

MfG
 
Eine Lösung wäre alles von "Hand" in Binär umzuwandeln aber dafür benötigt man wieder allerhand
Operationen. Möchte gern so wenig wie möglich Zeit für das Schreiben verbrauchen.
Wieso von Hand? Schreib den double-Wert doch einfach raus wie er im Speicher steht:
C:
double wert = 1.234;
// ...
fwrite(&wert, sizeof(double), 1, file);
Schneller geht es wohl kaum, und eine konstante Größe (nämlich sizeof(double) Bytes) pro Eintrag hast du so auch. Abgesehen davon verlierst du so keine Genauigkeit durch die Umwandlung in das Dezimalsystem.

Grüße,
Matthias
 
Zurück