XC8 Float Ergebnis nicht verständlich

OP #4164188
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
Gast #4164194
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?
Gast #4164217
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren