Forum: Mikrocontroller und Digitale Elektronik int > float Umwandlung


von Philipp (Gast)


Lesenswert?

hi

ich gebe mit folgender Zeile die Größe einer Datei aus:
1
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:
1
printf("%2.2f MB \n\r",(unsigned float)(file.length/1000000));
das klappt aber nicht, ich bekomm nur MB ausgedruckt. Hab ich was 
übersehen?

von Klaus S. (skibby)


Lesenswert?

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

Gruß, Klaus

von Philipp (Gast)


Lesenswert?

-ich benutze C18, wo kann ich sehen, ob printf float unterstützt?

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

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


Lesenswert?

1
klaus@a64c:~ > gcc  -Wall t.c
2
t.c: In Funktion »main«:
3
t.c:12: Fehler: sowohl »unsigned« als auch »float« in Deklaration

von Klaus S. (skibby)


Lesenswert?

Hallo Philipp,

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

siehe:
http://support2.microchip.com/KBSearch/KB_StdProb.aspx?ID=SQ6UJ9A003PQX

von Philipp (Gast)


Lesenswert?

ok, danke das hat geholfen.

von Stephan V. (orca)


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

von Philipp (Gast)


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

von Philipp (Gast)


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.

von Karl H. (kbuchegg)


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.

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.