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.
@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
doubleZahl=1234.768
2
intVorkomma=Zahl;
3
intNachkomma=(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.
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