Nachkommastellen
-
Es handelt sich um double-Werte. Davon dann die Nachkommastellen. Aber das Problem liegt darin, dass ich vorher anhand einer double-variable nicht wissen kann, wieviel Nachkommastellen es hat. Dazu muss das erst mal in einen String umgewandelt werden. Doch wie fordere ich für den String nur soviel Speicherplatz, wie nötig?
mfg
-
Die Frage ist unpräzise gestellt. Gleitkommazahlen werden intern exponential mit Mantisse und Exponent dargestellt. Somit haben sie keine angebbare Anzahl von Nachkommastellen, sondern nur eine angebbare Anzahl von Stellen (digits) insgesamt. Die Anzahl der möglichen Nachkommastellen hängt somit entscheidend von der Anzahl der Vorkommastellen ab.
-
Jeffson schrieb:
Es handelt sich um double-Werte. Davon dann die Nachkommastellen.
mfgKlar ist das double (int haben keine Nachkommstellen und float ist von gestern)
Die Nachkommstellen von 3.141 sind 141. Die Anzahl der Nachkommastellen ist 3.Die Nachkommstellen von 3.141e-1 sind 3141. Die Anzahl der Nachkommastellen ist 4.
Die Nachkommstellen von 3.141e-100 sind 0000...0003141. Die Anzahl der Nachkommastellen ist 103.
include <stdio.h> #include <math.h> int main() { double e, d; double f = 1.0; int i = 0; d = 1.0/3.0; // d = 3.12345678901234567890e-20 for (i = 0;modf(d*f,&e) > 0;i++,f*=10.0) ; printf("Anzahl Nachkomma von %g : %d\n", d, i); return 0; }
-
Wenn man nur die Nachkommastellen benötigt und die begrenzen will, wo liegt das Problem? Ein Rundung gibt es obendrein.
Beispiel für max. 9 Nachkommastellen:double d=2/3.,i; char s[9+3]; /* für '0','.','\0' */ sprintf(s,"%.9f", modf(d,&i)); puts(s);
-
Wieso funktioniert dies nicht:
char nkstellen[11]; memset(nkstellen, '\0', sizeof(nkstellen)); double vkst = 0; snprintf(nkstellen, sizeof(nkstellen), "%lf", modf(4.5, &vkst)); printf("nkstellen = %s\n", nkstellen);
Ergebnis: "nkstellen = 0.00000..." statt 0.50000 wird ausgegeben
mfg
-
Jeffson schrieb:
B.B. schrieb:
nicht wenn man sprintf richtig benutzt.
und achja, modf http://www.cplusplus.com/reference/clibrary/cmath/modf/ liefert u.a. den nachkommaanteil.Und wie soll ich festlegen, dass er nicht über mein char-Array schreibt?
Es gibt noch snprintf(), aber das scheint nicht ganz zu funktionieren.
Würde mich auf Hilfe freuen.mfg
du legst es im formatstring fest. die anzahl der vor- und nachkommastellen,
z.b.sprintf(buf, "%1.1f", r);
wieso sollte snprintf nicht funktionieren? das wäre mir neu.
char buf[4] = {0}; double r = 1.12345; sprintf(buf, "%1.1f", r); snprintf(buf,sizeof(buf)-1, "%f", r);
-
Vielen Dank, das ist das was ich gesucht habe!
Aber mich würds trotzdem interessieren, wieso der Code von mir oben nicht funktioniert hat?
mfg
-
Vermutlich hast Du
#include <math.h>
vergessen.
-
oder vkst mit 0.0 statt 0 initialisieren
-
Wenn es dich weiter interessiert, wie man mit sprintf oder anders eine Gleitkommazahl in Vorkomma- und Nachkommastellen zerlegen oder runden kann, findest du auf meiner hp http://berniebutt.npage.de dazu passende Codes zum Herunterladen. Bedenke, sprintf ist langsam. Doch das macht sich erst bei sehr vielen Aufrufen bemerkbar.
Ansonsten: wenn etwas sicher läuft, nimmt man das und fragt nicht warum etwas anderes nicht funktioniert!