Forum: Mikrocontroller und Digitale Elektronik Problem mit abgeschnittenen Nachkommastellen bei einer Berechnung (CCS C Compiler)


von Energieler (Gast)


Lesenswert?

Hallo, habe ein kleines Problem bei einer Berechnung. Ich verwende den 
CCS C Compiler zur Programmierung eines PIC µC. Das Problem betrifft 
folgende Formel:
1
dutyp = 30+(70/(max_temp-min_temp))*(temp-min_temp);

Die einzelnen Variablen folgendermaßen deklariert:
1
signed int16 temp=0;                         // Temperature in °C
2
int8 min_temp;                               // Min.-Temp
3
int8 max_temp;                               // Max.-Temp
4
signed int16 dutyp=0;                        // Percentage of Duty Cycle

Bei folgenden Werten:
min_temp = 20
max_temp = 50
temp = 47

Erhalte ich als Ergebnis 84. Richtig wäre 93.
Das Problem ist, dass bei der Division die Nachkommastellen wegfallen.

Habe schon einiges versucht mit der Variablendeklaration usw. Leider 
ohne Erfolg.

Wenn ich statt der Division "70/(max_temp-min_temp)" den dezimal Wert 
"2.3333" eingebe, dann stimmt das Ergebnis. Aber das bringt mich 
natürlich nicht weiter.

Wär klasse, wenn mir da jemand weiterhelfen könnte! :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Energieler schrieb:
> Wenn ich statt der Division "70/(max_temp-min_temp)" den dezimal Wert
> "2.3333" eingebe,
Du willst also mit Fließkommazahlen rechnen?
Probier mal das da: 70.0/(max_temp-min_temp)

von troll (Gast)


Lesenswert?

Eine der Variablen auf float casten, könnte aber erheblichen Overhead 
erzeugen. Oder Formel irgendwie umstellen?

von Integer (Gast)


Lesenswert?

Energieler schrieb:
> Das Problem ist, dass bei der Division die Nachkommastellen wegfallen.

Was erwartest Du denn? Wo sollen bei Integerwerten denn die 
Nachkommastellen herkommen?

von Fabian O. (xfr)


Lesenswert?

Du musst einfach die Division am Schluss machen, sonst ist das 
Zwischenergebnis zu ungenau.
1
dutyp = 30 + 70 * (temp - min_temp) / (max_temp - min_temp);

von Karl H. (kbuchegg)


Lesenswert?

> Wär klasse, wenn mir da jemand weiterhelfen könnte! :-)

Ja, ist völlig normal. Integer dividiert durch Integer ergibt nunmal 
wieder einen Integer.

Formel etwas umstellen, und die Sache ist erledigt.
Anstelle von a/b*c kannst du ja auch (a*c)/b rechnen um mathematisch 
dasselbe Ergebnis zu erhalten.

Als Faustregel kannst du dir merken: Du willst Divisionen soweit es geht 
nach "Rechts" verschieben, also erst so spät wie möglich machen. Aber 
Achtung: darauf achten, dass du zwischendurch dann in keine Overflows 
reinläufst.

von Energieler (Gast)


Lesenswert?

Danke für die zahlreichen Antworten! Hab jetzt die Formel umgestellt und 
alles funktioniert einwandfrei.

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.