Forum: Mikrocontroller und Digitale Elektronik Ausgabe/Umwandeln von float (als Text/in Text)


von Fritz (Gast)


Lesenswert?

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?

von Michael (Gast)


Lesenswert?

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
...

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

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.

von Fritz (Gast)


Lesenswert?

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).

von Karl H. (kbuchegg)


Lesenswert?

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.

von Fritz (Gast)


Lesenswert?

PS: Ich kenne bereits

http://elm-chan.org/fsw/strf/xprintf.html

aber darin ist leider auch keine Ausgabe für float...

von Dirk B. (dirkb2)


Lesenswert?

Schau dir doch mal die Quellen von sprintf in der GNU C Library (glibc) 
an.

Ist aber nicht einfach.

von Michael (Gast)


Lesenswert?

@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.

von Daniel S. (daniel_s49)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von Thomas W. (Gast)


Lesenswert?

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

von Walter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.