float in string?
-
AJ schrieb:
Vielleicht solltest du dich mal mit der internen Funktionsweise von float auseinandersetzen.
Um das ganze abzukürzen: Deine Zahl ist zu groß für float oder besser gesagt, sie ist zu groß um eine gewisse Genauigkeit zu garantieren.
Ich wiederhole mich ungern im selben Thread, aber anscheinend ist es nötig!
-
Entyl_Sa schrieb:
Ich brauche keine Werbung, mein Code spricht für sich selbst. *kotz*
Ähm ... könnte mir jetzt bitte mal jemand sagen was am besten funzt
? Weil Entyl_Sa's Beispiel (habe ich aus der Funktion rausgenommen) geht ohne Probleme:
double a = 1234567; a += 1.11; char b1[20]; char b2[20]; sprintf(b1,"%.20g",floor(a)); sprintf(b2,"%g\n",fmod(a,1.0)); printf("Method-2 Result: %s%s\n",b1,&b2[1]);
Das liefert, wie es sein sollte
Method-2 Result: 1234568.11
Habe das auch unter Windows NT (Service Pack 6) getestet. Hmm ich teste das mal nachher auf meinem Notebook mit Win 98...
Gruss,
~cp code_pilot
-
@AJ: Das ganze ist schon klar, zumindistens mir. Ändert aber nichts an der Tatsache, das die Zahl nicht schön ausgegeben wird. Unsere Funktionen machen genau das.
float a = 1234567; a = a + 1.11; printf("%.20e\n",a); //liefert 1.23456811000000010000e+006 fflush(stdout); printf("%.20e\n",a); //liefert 1.23456812500000000000e+006
Mein Problem das hier zwei unterschiedliche Ausgaben erzeugt werden habe ich dann auch auf das Genauigkeitsproblem zurueckgeführt. Ich dachte halt erst das er für ein und den selben Float die geliche Ausgabe erzeugen müßte. Bin aber dann zu dem Schluß gekommen das bei der ersten Ausgabe einfach noch der Double genutzt wird der noch im Register liegt, und bei der zweiten dann halt erst der schon zu
Float konvertierte Wert, mit mangelnder Genauigkeit.@miller_m: Wenn du Float anstelle von Double benutzt, dann kommt bei dir wahrscheinlich das gleiche raus wie bei mir auch. Das einzige Problem bei meinem Code ist das negative Zahlen nicht richtig ausgegeben werden, das werde ich aber jetzt gleich ändern.
-
code_pilot schrieb:
Ähm ... könnte mir jetzt bitte mal jemand sagen was am besten funzt
?
Wie ich in meinem letzten Post bereits erwähnt habe existiert noch ein Problem bei negativen Zahlen. Ausserdem ist mir gerade aufgefallen das es auch zu Problemen bei bestimten Nachkommazahlen gibt. Ich melde mich wenn mir eine Lösung eingafallen ist.
miller_m´s Funktion ist allerdings auch noch nicht ganz perfekt, z.B. bei 0.001 gibt er nur "0." aus.
-
Wenn sogar double nicht ausreicht, dann könntest du auch noch nach Bibliotheken suchen, die noch größere Fließkommazahlen zur Verfügung stellen. Konkretes weiß ich leider darüber aber nicht, nur dass es solche Bibliotheken gibt. Allerdings verwundert es mich sehr, dass es mit double nicht gehen sollte. Wie hat denn dein Formatstring ausgesehen als du es mit double versucht hast?
PS: @Entyl_Sa
Ja hab schon gesehen, dass du es schon bemerkt hast :). War nur deswegen, weil schon zum 2. mal nach meiner Erklärung nochmal danach gefragt wurde ;).PS: @code_pilot
Ich vermute mal du hast den double einfach mit %g ausgegeben, richtig? Für double musst du ein l noch einbauen, also %lg, sonst konvertiert er deinen double wieder in einen float und somit hätte sich nichts geändert ;).
-
Das Problem ist zu verhindern das die expotential Schreibweise verwendet wird, aber auch keine überflüssigen Nullen vorhanden sind.
Und das geht mir jetzt echt auf den Kecks das ich das nicht hinbekomme.
-
Huhu, ich habe jetzt endlich eine funktionierende Lösung (auch mit negativen Zahlen):
double calcNum = 1234567.8; calcNum += 1.1; sprintf(text, "%lf", calcNum); for(int a = strlen(text)-1;a>0;a--) { if(text[a] == '.') { text[a] = '\0'; break; } if(text[a] != '0') { text[a+1] = '\0'; break; } } printf("%s\n", text);
~code_pilot
-
Buggy Forum (s.o.) ???
-
Sowas ist mir auch schon in den Kopf gekommen, aber ich hätte das ganze halt gerne irgendwie über printf gelöst.
-
LOL hmmm aber so gates
-
Wenn schon Nullen abschneiden, dann habe ich mich mal etwas in Optimierung versucht.
int a; char text[100]; double calcNum = 1234567.8; calcNum += 1.1; a = sprintf(text, "%lf", calcNum)-1; for(;text[a]=='0';a--); if(text[a]=='.')text[a]='\0'; else text[a+1]='\0'; printf("%s\n", text);
sprintf liefert die Anzahl der geschriebenen Zeichen, also warum verfallen lassen nur um anschliessend strlen aufzurufen. Dann habe ich mir gedacht überlese doch einfach alle hinteren Nullen, und gucke nacher was das letzte Zeichen war. Das spart Vergleiche. Die Bedingung a>0 habe ich gleich ganz weggelassen, weil das liefert sowieso immer true.
Wenn du den ganzen Code nicht etliche hundert male ausführst wohl nicht gerade wichtig, aber man beachte die Uhrzeit, ich konnte einfach nicht pennen.
Gruß
Entyl Sa