mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie richtig rechnen ohne Gleitkomma?


Autor: Vielleicht Alois (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte aus einer Distanz und der Zeitdifferenz, die benötigt wird um 
die Distanz zurückzulegen die Geschwindigkeit in km/h berechen. Ich 
schaffs nicht ohne float-Variablen einen Richtigen Wert zu bekommen.

Der Angezeigte Wert entspricht eher dem in m/s statt km/h, allerdings 
auch nicht exakt.
  uint8_t  vmax_sec=0; // Anfang der Distanz Vm_Dist
  uint16_t vmax_ms=0;
  uint8_t  GesZ_sec=0; // Ende der Distanz Vm_Dist
  uint16_t GesZ_ms=0;
                      
  uint8_t Vm_Dist=5;   // Distanz in Meter
  uint16_t vmax=100;
  char c_vmax[6];

// ... Zeitmessung...

// Geschwindigkeitsberechnung:
vmax= (Vm_Dist*18000) / ((GesZ_sec*1000 + GesZ_ms - vmax_sec*1000 - vmax_ms)*5);

itoa(vmax,c_vmax,10);
lcd_gotoxy(0,3);
lcd_puts("Vmax: "); lcd_puts(c_vmax); lcd_puts(" km/h");


m/s = mm/ms
m/s *3,8 = m/s *18/5 = km/h, oder?

Ich habe einen Überlauf beim Rechnen befürchtet und für vmax auch schon 
uint32_t probiert.
Wie gehts richtig?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3,6

Autor: Vielleicht Alois (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tippfehler

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann doch nicht so schwer sein ein Komma zu vermeiden. Im 
Wesentlichen
v:= (Distanz/Zeit )* (Korrekturfaktor / Skalierung)

Wobei der Korrektur ein Ganzzahlwwert ist, die Skalierung eine Division 
durch 2^N , zB div 256 oder so, was ein Schieben nach Rechts um 8 bit 
ist.

Das Ganze in 32bit, falls noetig.

Autor: Vielleicht Alois (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nichts ist schwer, wenn man weis wies geht. Oder zumindest nicht viel 
;-)
also z.B. statt
*18000/5
*28800/8

Die Einzelnen Summanden müssen aber nicht 32bit groß sein, oder?

ich werds Morgen ausprobieren,
besten Dank!

Autor: MichiB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
d = 19999m
t = 100s

normale int Rechunug:
v = d/t  = 1999/100 = 19 falsch (-1)

sakliert:
v = d/t  = 1999 * |2^15| / 100 = 65503232

Ergebnis. 65503232 >> 15 = 1999

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Festkommaarithmetik

MFG
Falk

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.