Forum: Compiler & IDEs Division OHNE float / libm.lib?


von AVRli (Gast)


Lesenswert?

Hallo,

ich möchte ganz gerne auf die Einbindung der libm.lib für eine float 
Division verzichten da es langsam eng im Programmspeicher wird und ich 
diese Funktion genau einmal brauche.

Es geht darum das ich zwei Werte teilen muss als Beispiel wäre mal

uint16_t a, b,c;
1
// 50 / 23
2
// Ergebnis SOLL = 2,1739
3
a = 50;
4
b = 23;
5
// Ergebnis  IST = 2
6
c = a / b;

nur wie bekomme ich die Nachkommawerte doch noch heraus?
Ich kann noch mit
1
a % b

den Rest ermitteln, in dem Fall 4 aber wie komme ich damit nun auf die 
0,1739 ???

Geht das überhaupt?

Vielen Dank im Voraus.

Gruß AVRli...

von g457 (Gast)


Lesenswert?


von Detlev T. (detlevt)


Lesenswert?

Was soll den 0,1739 sein, wenn du kein float hast? ;-)

Du könntest den Dividenden vorher mit 100, 1000 etc multiplizieren und 
dann das Ergebnis entsprechend interpretieren.

von AVRli (Gast)


Lesenswert?

Detlev T. schrieb:
> Was soll den 0,1739 sein, wenn du kein float hast? ;-)

Ja über den UART will ich schon den Wert
0002 und dann nochmal 1739 ausgeben.

Am PC kann ich mir den als Float dann zusammensetzen. Ich kann aus 
Platzgründen die lib nicht einbinden.

Gruß AVRli...

von Detlev T. (detlevt)


Lesenswert?

Am Besten nimmst du die Funktion div(), die liefert dir quotient und 
Rest gleichzeitig. Dann multiplizierst du den Rest mit 10000 und teilst 
diesen Wert noch einmal. Dann hast du die vier Nachkommastellen. Bei der 
Umwandlung in ASCII muss du aber darauf achten, dass die führenden 
Nullen mitkommen.

von AVRli (Gast)


Lesenswert?

Detlev T. schrieb:
> Du könntest den Dividenden vorher mit 100, 1000 etc

Das werde ich machen, das nimmt den wenigsten Platz ein und reicht für 
mein Vorhaben eigentlich auch aus!
1
c = (a*100) / b;
2
// Ergebnis  IST = 217

Danke!

AVRli...

von Jörg G. (joergderxte)


Lesenswert?

@AVRli: Du hast natürlich getestet, dass dein Programm größer wird, wenn 
du die libm linkst, oder?

von Rolf Magnus (Gast)


Lesenswert?

Du mußt dabei aber auf den Wertebereich aufpassen. a darf dann eben nur 
noch maximal 655 sein.

von Detlev T. (detlevt)


Lesenswert?

Rolf Magnus schrieb:
> Du mußt dabei aber auf den Wertebereich aufpassen. a darf dann eben nur
> noch maximal 655 sein.

Oder man erzwingt beim Compiler 32-Bit-Arithmetik, indem man nicht mit 
100, sondern mit 100UL multipliziert.

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.