www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik int > float Umwandlung


Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

ich gebe mit folgender Zeile die Größe einer Datei aus:
printf("%ld \n\r",file.length); 
Das klappt auch, mit dem Handycap, dass ich bei einer 3,5MB Datei 
3500000 ausgedruckt bekommen. Nun wollte ich das ganze in MB Form 
ausgeben lassen:
printf("%2.2f MB \n\r",(unsigned float)(file.length/1000000));
das klappt aber nicht, ich bekomm nur MB ausgedruckt. Hab ich was 
übersehen?

Autor: Klaus Skibowski (skibby)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. benutzt Du eine printf-Version mit floating point Untersützung ?
2. unsigned float gibts nicht (muesste der Compiler eigentlich meckern 
...)

Gruß, Klaus

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-ich benutze C18, wo kann ich sehen, ob printf float unterstützt?

-ich hab versuchsweise unsigned weg gelassen, Ergebnis ist allerdings 
das selbe...

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

Bewertung
0 lesenswert
nicht lesenswert
a/b

wenn a ein long ist und b ein long ist, dann wird eine Ganzzahldivision 
gemacht mit einem long Ergebnis. Du kannst das Ergebnis danach casten 
wie du lustig bist, das interessiert die Division nicht. Zum Zeitpunkt 
des Casts ist das Kind schon in den Brunnen gefallen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klaus@a64c:~ > gcc  -Wall t.c
t.c: In Funktion »main«:
t.c:12: Fehler: sowohl »unsigned« als auch »float« in Deklaration

Autor: Klaus Skibowski (skibby)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Philipp,

C18 untersützt wohl gar kein floating point in printf.

siehe:
http://support2.microchip.com/KBSearch/KB_StdProb....

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke das hat geholfen.

Autor: Stephan V. (orca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider hat die Funktion vom Link einen Bug

probier mal -1.01 in einen String um zu wandeln -> "-1.-1"

1. Vorzeichen wird auch bei Nachkommastellen ausgegeben
2. Führende Nullen der Nachkommastellen werden "vergessen"

hier ein 1-Zeiler der obige Probleme behebt:
 sprintf(str, "%i.%02i\n", (int)f, abs((int)(f*100))%100);

ad 1.)
- abs() entfernt das Vorzeichen der Nachkommastellen
- (f*100)%100 liefert dir die ersten beiden Nachkommastellen
    Modulorechnung find ich persönlich schöner und vor allem kürzer, als 
diese Doppelmultiplikation und Subtraktion (aber das ist wohl 
Geschmackssache)

ad 2.)
- "%02i" sorgt dafür, daß das Ergebnis aus mindestens 2 Zeichen besteht. 
Sonst wird mit 0 aufgefüllt. Wegen oben (Modulo 100) hast du maximal 2 
Stellen ==> du hast immer genau 2 Nachkommastellen

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir funktionierts...:


unsigned int whole, part;

whole=(int)((float)file.length/1000000);
part =(int)((float)file.length/10000)-whole*100;

printf("%2d.%2d MB \n\r",whole,part);

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aja, habs geschnallt, du meintest bei negativen floats... das hab ich 
nicht probiert, da die datei länge ohnehin nur positiv sein kann...

was mich allerdings noch etwas zu schaffen macht, ich bekomm z.B. 
folgende Ausdrucke:

2.23 MB
4.43 MB
3.4 MB
8.01 MB

Das heißt, wenn die 2. Nachkommastelle 0 ist, wird nur eine ausgedruckt, 
was ja auch klar ist. Mit auffüllen komm ich da aber nicht weiter, da 
immer vor der Zahl aufgefüllt wird und das macht bei Nachkommastellen 
wenig Sinn...

eine umfangreiche Abfrage mit if usw. ist mir aber zu aufwendig.

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

Bewertung
0 lesenswert
nicht lesenswert
Philipp schrieb:
> eine umfangreiche Abfrage mit if usw. ist mir aber zu aufwendig.

Dann sieh dir die Doku zu den Formatieranweisungen in printf an.
Die 0 in
  printf("%2d.%02d MB \n\r",whole,part);
hat schon ihren Sinn.

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.