Forum: Mikrocontroller und Digitale Elektronik XC8 Float Ergebnis nicht verständlich


von Georg K. (gkeller)


Lesenswert?

Hallo,

ich habe mal wieder ziemlich viel Zeit damit verbracht etwas 
herauszufinden was ich so nicht erwartet hatte.

Ich wollte einfach einen Wert in einen prozentualen Anteil umrechnen und 
bin dabei auf folgendes gestoßen.
1
unsigned int PWMresolution    // Aufloesung des PWM Moduls 10 Bit
2
unsigned int dutycycle        // Aktueller Wert 930
3
float        PCofDC           // Prozentangabe des +DutyCycle
4
5
PCofDC  = dutycycle * 100 / PWMresolution

Die Werte oben sind Beispielwerte. Mit der Formel bekomme ich immer 
falsche Werte heraus. Erst wenn ich die Formel dahingehend abändere das 
ich anstatt 100 als Ganzzahl 100.0 als Fließkommazahl eintrage sind die 
Werte in der Ergebnis Variablen richtig. Ich hab die doch als float 
deklariert ....

Ich bin jetzt nicht der C Experte, liege ich da falsch und habe einen 
Denkfehler oder macht der Compiler etwas was ich nicht erwarten müsste?

Das hat mich jetzt mal locker 6 Stunden gekostet und würde gern wissen 
ob das ein Denkfehler bei mir ist, vielleicht kann jemand dazu etwas 
schreiben.

Vielen Dank und Gruß, Georg

von ... (Gast)


Lesenswert?

1
PCofDC  = dutycycle * 100 / PWMresolution;
2
3
PCofDC  = (float) ( (int) dutycycle * (int) 100 / (int) PWMresolution );

Promotion:
1
PCofDC  = dutycycle * 100.0 / PWMresolution;
2
3
PCofDC  = (float) dutycycle * (float) 100.0 / (float) PWMresolution;

Alles klar?

von Dr. Sommer (Gast)


Lesenswert?

Georg Keller schrieb:
> PCofDC  = dutycycle * 100 / PWMresolution
dutycycle ist 10bit, 100 ist 7bit, das Ergebnis der Multiplikation ist 
also 17 bit - ein Bit zu viel für das vermutlich 16bit große "int" auf 
deiner Plattform. Rechne einfach mit 32bit:
1
PCofDC = ((uint32_t) dutycycle) * ((uint32_t) 100) / PWMResolution;
Das Ergebnis hat dann zwar keine Nachkommastellen, dafür ist die 
Rechnung viel effizienter als mit float...

von ... (Gast)


Lesenswert?

Ob "uint32_t" auf einem PICklig effektiver als float ist,
ist nicht sicher Spatzi :-)

Das float rechnet er u.U. nur mit 24 bit.

von eProfi (Gast)


Lesenswert?

Wenn Du es elegant lösen willst: Festkommaarithmetik
Du kannst mit einer einzigen Multiplikation und ein paar Shifts 
auskommen.

Oder: rechne Promille aus und gebe zwisschen vorletzter und letzter 
Stelle ein Komma aus.

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.