mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechnung mit 16 und 32 bit


Autor: Hannes S. (hannestum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss 2 Zahlen die in 16bit Reinpassen miteinander multiplizieren. 
Das Ergebnis speichere ich in einer Variablen mit 32 bit. Danach möchte 
ich die Zahl durch einen eigestellten Teiler teilen, und am Display 
ausgeben.

Dafür hab ich folgenden Code geschrieben:
uint16_t adtg = 9765;
uint16_t adcval_1 = 798;
uint32_t temp_32;
uint16_t teiler = 10000;
uint16_t erg;

temp_32 = adtg*adcval_1;
erg = temp_32/teiler;

Also:
9756*798=7785288
7785288/10000=778.5288

Ich dachte, dass die Nachkommastellen jetz einfach verworfen werden da 
es sich ja un einen Integer handelt (Die nachkommastellen brauch ich 
auch nicht) und einfach 778 ausgegeben wird. Leider funktioniert das 
nicht.
Denke da hab ich wohl irgendeien fehler oder Wickel mit den 32 und 16 
bit!

Wer kann mir sagen wie es richtig geht?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Leider funktioniert das nicht.

Was passiert denn?

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
temp_32 = (uint32_t)adtg*(uint32_t)adcval_1;

Vlt so..

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib mal
temp_32 = (uint32_t)adtg*(uint32_t)adcval_1;

das sollte dann gehen.

Autor: Hannes S. (hannestum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er schreibt einfach "5" dorthin wo eigentlich 778 stehen sollte.

Falls ich einfach eine uint16 festlege und die ausgebe funktionierts. 
Also ist es nicht der Display und nicht meine Art eine Zahl auf das disp 
zu schreiben. Der Fehler muss bei den Rechnungen irgendwo passieren...

Autor: Hannes S. (hannestum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, zuspät gelesen.

temp_32 = (uint32_t)adtg*(uint32_t)adcval_1;

funktioniert! Danke!
Was macht das vorangestellte (uint32_t) genau? Konvertiert
das die Zahl vor der Rechnung in 32 bit?

Autor: Willi Wacker (williwacker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja!

Vor der Rechnung und nur für die Rechnung

Autor: Mätte T. (maette)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieso lässt du das temp32 nicht weg und machst gleich:
erg = (uint16_t)(adtg*adcval_1/teiler);
bzw.
erg = (uint16_t)(adtg/teiler*adcval_1);

beim 2. brauchst du ( er intern ) nicht do große Zahlen zum rechnen, 
dafür wirds aber ungenauer, da die Nachkomma verfallen.

Bei 1. und 2. sparst du dir eine 32-Bit Variable.

Das (uint32_t) ist ein Type-Cast der die Nachfolgende Zahl in diesen Typ 
wandelt.

mfg

Autor: Willi Wacker (williwacker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, zu schnell auf Absenden gedrückt.

Das Ganze nennt sich "casten" und ist eine Art der Compilersteuerung. Du 
weist den Compiler damit an, die Rechnung in der entsprechenden Form 
auszufürhen.

Das Casten ist in C sehr sehr wichtig. Wenn Du hier schwächelst, 
solltest Du diese Schwäche unbedingt ausmerzen. Gute Tuts gibts in Hülle 
und Fülle.

Autor: Hannes S. (hannestum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, da hab ich wirklich eine Schwäche...
Vielen Dank jedenfalls für die ausführliche Hilfe!

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.