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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.