Wie richtig rechnen ohne Gleitkomma?

Gast #1321659
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.
1
  uint8_t  vmax_sec=0; // Anfang der Distanz Vm_Dist
2
  uint16_t vmax_ms=0;
3
  uint8_t  GesZ_sec=0; // Ende der Distanz Vm_Dist
4
  uint16_t GesZ_ms=0;
5
                      
6
  uint8_t Vm_Dist=5;   // Distanz in Meter
7
  uint16_t vmax=100;
8
  char c_vmax[6];
9

10
// ... Zeitmessung...
11

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

15
itoa(vmax,c_vmax,10);
16
lcd_gotoxy(0,3);
17
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?
Gast #1321674
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.
Gast #1321682
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren