www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Keine Ausgabe von Floatzahlen möglich beim gcc - Compiler??


Autor: Patti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
sorry das ich noch einen Thread hier im MSP430 Forum aufmache, aber ich 
bin verzweifelt!!!
ich habe ein großes Problem beim MSp430 in Verbindung mit Eclipse, wenn 
ich eine Floatzahl bzw. Double ausgeben möchte.
Siehe: Beitrag "Ausgabe von float/double Zahl via printf in Eclipse mit gcc"
Ich bin  für jeden Tipp dankbar und würde auch gerne wissen ob jemand 
von Euch mit dieser Kombination arbeitet.

Nun zu meinem Problem:
_____________________________________________________________________
Ich habe ein Problem bei der Ausgabe von einer double bzw. float Zahl.
Ich benutze einen MSP430F149 und möchte einen AD-Wert via serieller
Schnittstelle ausgeben.
printf funktioniert einwandfrei mit normalen Strings. Nun wollte ich
eine float Zahl zum testen (zB. 1.23) folgendermaßen ausgeben:

double zahl=1.23;
printf("%f",zahl);

Die Ausgabe hierfür auf dem Hyperterminal ist f . Wie kann das sein und
wo liegt der Fehler???

Die Ausgabe einer int-Zahl funktioniert jedoch einwandfrei.
_____________________________________________________________________

Muss ich noch eine Libary hinzufügen? Wo finde ich denn das Fine Manual? 
Oder ist eine Ausgabe von Floatzahlen nicht möglich????

Ich habe schon etliche Zeit mit recherche im Internet verbracht und ich 
finde immer nur wiedersprüchliche Angaben.

Danke Für Eure Hilfe :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wage mal zu behaupten:
Wenn Jörg nicht mit Sicherheit weiss, ob es eine
float-Implementierung für printf gibt, dann weiss
es niemand in diesem Forum.

Musst du dir halt selbst eine schreiben.
Ist doch nicht weiter wild. Hast du ein
ftoa() bzw. dtoa() zur Verfügung?
Ansonsten: Den Vorkommaanteil kriegst du
(wenn der Zahlenbereich reicht) durch einen
cast nach int. Den Nachkommaanteil: Den int
von der Zahl abziehen. Dadurch bleibt nur
der Nachkommaanteil übrig. In einer Schleife
immer wieder mit 10 multiplizieren bringt jeweils
die nächste Stelle vor das Komma. Mit einem cast
nach int abtrennen und ausgeben.
Das Vorzeichen nicht vergessen!
Wenn deine Zahlen nicht allzugross oder allzuklein
sind, reicht das dann schon. Probiers mal auf dem
Papier durch, ist nicht weiter wild.

   672.5023

Nach int casten, macht       672      Vorkommaanteil, ausgeben
dann einen '.' ausgeben
Von 672.5023 die 672 abziehen, macht 0.5023

0.5023 * 10   -> 5.023     int casten -> 5      672.5
5.023 - 5 -> 0.023
0.023 * 10    -> 0.23      int casten -> 0      672.50
0.23 - 0  -> 0.23
0.23 * 10    -> 2.3        int casten -> 2      672.502
2.3 - 2  ->  0.3
0.3 * 10  -> 3.0           int casten -> 3      672.5023
3.0 - 3  ->  0.0  fertig

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>3.0 - 3  ->  0.0  fertig

da sollte man vielleicht lieber "<= 0.1" als Grenze benutzen, da eine 
float-Zahl (immer) einen gewissen "Rattenschwanz" mitführt.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist richtig.
Auch zwischendurch ist einfaches casten ev. nicht so toll :-)

Wenn 3 oder 4 Nachkommastellen reichen und keine negativen
Zahlen vorkommen, gehts noch einfacher:

  double d = 672.5023;
  int Vorkomma = (int)d;
  int Nachkomma = ( d - Vorkomma ) * 1000;
  printf( "%d.%03d", Vorkomma, Nachkomma );

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kenn den gcc-Compiler nicht, aber vielleicht gibts auch da 
Compiler-options für printf()? Je mehr printf() kann, umso grösser wird 
natürlich der Code. Bei CodeVision kann ich verschiedenes einstellen 
(int,long,float).

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim gcc ist es so, dass je nachdem was printf alles können
soll, verschiedene Bibliotheken dazugelinkt werden müssen.
Wenn es die entsprechende Bibliothek auf einem spezifischen
gcc-System nicht gibt, schaust du in die Röhre.

Dann bleibt nur: Selber machen oder jemanden finden, der
die spezielle printf-Library auf den spezifischen Port
anpasst. Letzteres dürfte kein allzugrosses Problem sein,
da ja printf() auch in C geschrieben ist und eigentlich
nichts Plattform-spezifisches enthält (zumindest wenn
ich mal überschlägig nachdenke, kann mich auch irren).
Müsste einfach nur mal wer machen. Hat wahrscheinlich
auch für den MSP430 schon wer gemacht. Nur: Den muss man
erstmal finden.

Autor: Patti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke noch mal für Eure Mitarbeit. Habe jetzt die Bestätigung das 
Floatzahlen nicht bei printf unterstützt werden.
Habe jetzt das Problem so wie Karl Heinz gelöst.
Bye Patti

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.