Ich suche eine Möglichkeit (a la printf) um float (evt. auch double) ausgeben zu können. Andere Zahlen/String sind kein Problem, aber wie kann man floats behandeln? (Bitte keinen Hinweis auf printf, ich möchte verstehen, wie man es macht...) Gibt es da vielleicht schon fertigen Code, den man einsehen kann?
Mögliches Prinzip: Zahl ganzzahlig durch 10^(x=Anzahl der Stellen vor Komma - 1) teilen, Zahl niederschreiben (Konvertieren in ASCII Pendant) 10^x * Ergebniszahl vom Rest abziehen Mit Rest wiederholen bis Anzahl Stellen vor Komma = 0 Dann fortfahren mit Rest / 10^(-Anzahl Stellen)... Beispiel: 123456789,123456 (9 Vor, 6 nach Komma = 123456789,123456 / 10^8 (Anzahl - 1) => 1 23456789,123456 / 10^7 => 2 ... 9,123456 / 10^0 => 9 Komma einfügen 0,123456 / 10^-1 => 1 0,023456 / 10^-2 => 2 ...
Ausgeben worauf. In welcher Sprache "C", "C++", "Assembler", BASCOM? Wenn's darum geht das ganze in eine ASCI Folge zu wandeln kann man es sich einfach machen und in "C" z.B. das selbe Prinzip anwenden welches man auch z.B. benutzt um eine byte oder word in eine solche ASCI Folge zu wandeln. Vereinfacht kümmert man sich zuerst um das was vor dem Komma steht. Dann gibt man im Sting ein "," oder einen "." aus und dann kommt der Part nach dem Komma.
Danke für eure Antworten! @Michael Schaut aber auf den ersten Blick recht rechenintensiv aus, vor allem da es sich jeweils um Berechnungen mit float handelt? @Thomas Sprache ist C, Umwandeln z.B. in eine Byte Array/String, damit man diesen dann auf ein LCD, einen seriellen Port ausgeben kann oder in eine Datei auf der SD-Karte (oder was auch immer) schreiben. Es sollte aber auch auf einem nicht ganz so gut ausgestatteten uc funktionieren (also limitiert im Speicher und Performance).
Fritz schrieb: > Danke für eure Antworten! > > @Michael > Schaut aber auf den ersten Blick recht rechenintensiv aus, > vor allem da es sich jeweils um Berechnungen mit float handelt? > Von nix kommt nix.
PS: Ich kenne bereits http://elm-chan.org/fsw/strf/xprintf.html aber darin ist leider auch keine Ausgabe für float...
Schau dir doch mal die Quellen von sprintf in der GNU C Library (glibc) an. Ist aber nicht einfach.
@Fritz:
Jap ist es. Aber man kann eigentlich mit einem Typecast und einer
Float-Berechnung auskommen:
Zahl zu 4-Byte INT konvertieren
verfahren wie beschrieben
Nachkommastellen dann entsprechend mittels Multiplikation vors Komma
holen
Verfahren wie beschrieben
Beispiel:
123456789,123456 ->
123456789 / 10^8 => 1
23456789 / 10^7 => 2
...
9 / 10^0 => 9
Komma einfügen
0,123456 * 10^6 = 123456 (zum weiterrechnen)
123456 / 10^5 => 1
...
6 / 10^0 => 6
Also man kann das ganze durchaus auch mit weniger rechenintensiven
Operationen ausführen.
Aber, wie Karl Heinz sagte:
> Von nix kommt nix.
Fritz schrieb: > Schaut aber auf den ersten Blick recht rechenintensiv aus, > vor allem da es sich jeweils um Berechnungen mit float handelt? Für die Ausgabe vor dem Komma kannst du deinen Float auf Int casten und den Nachkommaanteil abschneiden ( (int)9876.12345 => 9876). Damit ist der Teil nicht so rechenintensiv. Dann ziehst du den Int von deinem Float ab und hast damit nur noch den Nachkommaanteil -> 0,12345. Wenn du den jetzt mal 10000 rechnest, hast du 12345, damit wieder nen Int und kannst den mit der selben Funkion ausgeben, mit der du auch den Teil vor dem Komma ausgegeben hast. Abgesehen davon, dass du mit dem Vorgehen immer 5 Nachkommastellen hättest, auch wenn die alle Null sind.
Michael schrieb: > Also man kann das ganze durchaus auch mit weniger rechenintensiven > Operationen ausführen. > > Aber, wie Karl Heinz sagte: >> Von nix kommt nix. Das Problem bei Floating Point Ausgaben im allgemeinen Fall besteht darin, dass man ja nach Größe der Zahl unterschiedliche Ausgabeformate haben möchte und auch unterschiedliche Strategien anwenden kann bzw. muss. Weiss ich zb, dass der Vorkommaanteil sich mit einem int erschlagen lässt und brauche ich zb nur 4 Nachkommastellen, dann geht das unter Zuhilfenahme einer Funktion, die einen int ausgeben kann recht trivial.
1 | double Zahl = 1234.768 |
2 | int Vorkomma = Zahl; |
3 | int Nachkomma = ( Zahl - Vorkomma ) * 1000; |
4 | |
5 | printf( "%d.%04d", Vorkomma, Nachkomma ); |
aber das sind natürlich Sonderfälle. Im Allgemeinen, speziell wenn dann auch noch Exponentialschreibweise ins Spiel kommt, kann das schnell recht aufwändig werden.
:
Bearbeitet durch User
Michael schrieb: > Beispiel: > 123456789,123456 (9 Vor, 6 nach Komma So sieht eine Float-Zahl im Rechner doch gar nicht aus. Das wäre schon die in Text umgewandelte Form. Intern besteht jede Floatzahl aus zwei Binärzahlen im Zweiersystem, der Mantisse und dem Exponenten. Das IEEE single precision Format verwendet z.B. 1 Bit für das Vorzeiche, 24 Bit für die Mantisse und 8 Bit für den Exponenten. Die Mantisse ist so normiert, dass sie immer zwischen 1 und 2 liegt, so dass das erste Bit konstant 1 ist und im Rechner weg gelassen wird. Damit kommmt eine Single Precision Float Zahl insgesamt auf 32 Bit. http://de.wikipedia.org/wiki/IEEE_754
Karl Heinz schrieb: > Im Allgemeinen, speziell wenn dann > auch noch Exponentialschreibweise ins Spiel kommt oder negative Zahlen die in deinem Beispielcode auch fehlen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.