www.mikrocontroller.net

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


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
// 50 / 23
// Ergebnis SOLL = 2,1739
a = 50;
b = 23;
// Ergebnis  IST = 2
c = a / b;

nur wie bekomme ich die Nachkommawerte doch noch heraus?
Ich kann noch mit
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...

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!
c = (a*100) / b;
// Ergebnis  IST = 217

Danke!

AVRli...

Autor: Jörg G. (joergderxte)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.