PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Double to String?



theodrin
11.02.2008, 13:11
Hallo!

Ich brauche eine Funktion in C, die mir eine Zahl vom Typ double in einen String umwandelt.
Gibts sowas, bzw. wie mache ich sowas?
Oder wie gehts eben?

lg,

uwegw
11.02.2008, 13:57
AVR-GCC?
dtostrf() aus <stdlib.h>
Alles weitere findest du in der avr-libc-Doku.

theodrin
11.02.2008, 17:15
Ne, verwende die MCC18 von Microchip!

Da ist kein dtostrf() in der Standard lib. Blöd!

Aber gibts nicht irgendwo den Quellcode dazu? Dann pack ich die funktion halt in mein Programm so dazu.

lg,

theodrin
11.02.2008, 20:13
Oh, blöd!!

Tschuldigts!! Ich bin im falschen Unterforum!
War nicht meine Absicht!

Sorry!!

fumir
12.02.2008, 08:48
nen double per hand in nen string umzuwandeln ist sehr aufwendig und kompliziert. such besser weiter nach ner bibliothek die ne entsprechende konvertierungsroutine beinhaltet.

wenn du wirklich den quellcode für so ne umwandlung analysieren willst, dann schau doch mal bei den gnu c bibliotheken. für die gibts den quellcode im web. aber den betreffenden quellcodeteil dann zu finden ist auch schon ne kleine herausforderung :-)

ansonsten findest du in wikipedia den genauen aufbau einer fließkommazahl (wobei zu klären wäre, ob in deiner softwareumgebung das übliche ieee format verwendet wird, oder ein gänzlich anderes format, denn man kann ne fließkommazahl auf sehr viele verschiedene arten binär codieren) und kannst dir daraus (mit entsprechenden mathematik- und programmierkenntnissen) ne eigene konvertierungsroutine basteln (viel spass dabei!).

theodrin
12.02.2008, 10:35
Tja, also da hast du sicher Recht, das das aufwendig ist.
Also dacht ich ich versuchs anders.
Hab in den standard io functions nachgesehen und was findet man da. Das tolle sprintf();
Also hab mich mal gefreut. Ich schreibe einfach die Zahl in einen string und den kann ich wunderbar auf meinem LCD ausgeben.
Nur leider gibts ein Problem: Ich finde keinen passenden Platzhalter für ein Double und auch nicht für ein Float. Es gibt zig für int (ich kanns binär, oktal, hex, ... ausgeben, hab was für char, für string, für pointer, sogar für die Speichergröße), bei dem alles so klappt wie es soll, aber nix für float oder double.
Kennt sich da wer aus, bzw. hat damit schon gearbeitet?
Bitte!!!!

Edit: Also nicht das ihr glaubt ich habs nicht ausprobiert. Hab e, E, f, F, lf, G, g ausprobiert aber es geht nicht. Das macht mich jetzt schon ärgerlich, weil das sonst überall geht. Hab in AVR nachgesehen. Da gehts. Das ist echt ärgerlich.

fumir
14.02.2008, 10:26
naja, vermutlich unterstützt deine bibliothek eben keine floats/double. wenn es mit sprintf geklappt hätte, dann gäbe es vermutlich auch ein dtostrf in deiner bibliothek :-)

ich hab mal in java ne routine geschrieben, die ein hp fließkommaformat manuell in das java format umgewandelt hat. aber das ist natürlich viel einfacher, als die umwandlung in nen string.

wenn du irgendwie gar keine lösung findest, und es wirklich wirklich wichtig ist, dann mach ich mir mal die (vermutlich nicht unerheblche) arbeit und helfe dir beim schreiben einer eigenen umwandlungsroutine (wobei ich für nix garantiere).
schick mir dann mal ne normale email (siehe deine pn)

theodrin
14.02.2008, 11:27
Na ja, es ist wirklich wichtig, aber ich hab inzwischen eine, na ja, recht annehmbare Lösung gefunden.
Ich hab ja erwähnt, dass es mit int bei der function sprintf() funktioniert. Da hab ich ganz einfach zuerst alle Nachkommastellen abgeschnitten. Das vorm Komma in einen String geschrieben. Dann einen Dot und dann hab ich ganz einfach mit 10^<genauigkeit> die double Zahl mutlipliziert. Mir die Nachkommas rausgefischt und mit denen wieder ne Ganze Zahl. Das hab ich dann wieder an den vorherigen String rangehängt. Also ist wahrscheinlich nicht die feine Programmierer-Art, aber es funktioniert.

Trotzdem danke für deine Hilfe. Das ist echt ein tolles Angebot. Bekommt man nur selten. Respekt!!

lg,
Norbert

fumir
15.02.2008, 13:37
schön das es so einfach klappt!

der aufwand bei so etwas ist natürlich stark davon abhängig, welche formatierungsmöglichkeiten man benötigt. wie es scheint brauchst du nur so was in der art "123.456"
die üblichen bibliotheksroutinen müssen natürlich nen viel größeren anwendungsbereich abdecken, was die sache deutlich aufwendiger macht.

dann machts auch noch nen unterschied, ob man einige wenige werte umwandeln will, oder ob man millionen von werten in sinnvoller zeit umwandeln muss :-)