www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Wie richtig rechnen ohne Gleitkomma?

Autor: Vielleicht Alois (Gast)
Datum:

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:

3,6
Autor: Vielleicht Alois (Gast)
Datum:

tippfehler
Autor: ... (Gast)
Datum:

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:

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:

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:

Siehe Festkommaarithmetik

MFG
Falk

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net