Unterschiedliche Ergebnisse bei float und long

Gast #2634539
Lesenswert?

Hallo!

Hab folgende Codezeilen:
1
  
2
float one_ticks;
3
unsigned long clk;
4
unsigned char divider;
5
unsigned long ticks;
6
unsigned long time_us;
7

8
....
9

10
one_ticks = (float) (((float)divider) / ((float) clk)); //seconds
11
one_ticks = one_ticks * 1e6; //µs
12
ticks = (unsigned long)(time_us / one_ticks);

Nicht schön, aber funktioniert.

Nun wollte ich den Code optimieren und vor allem mit integer/long 
rechnen.
Die einzelnen Rechenschritte zusammengefasst sieht dann theoretisch so 
aus:
1
ticks = (unsigned long) ((time_us * clk) / (divider * 1e6));

Aber funktionieren tut's nicht! - Was mache ich falsch?
Wie optimiere ich richtig?

Danke für eure Hilfe.

Gruß
Juri
Gast #2634582
Lesenswert?

Du verwendest offensichtlich etwas, was fälschlicherweise als 
Programmiersprache bezeichnet wird, jedoch aufgrund der uneindeutigen 
und meist compilerabhängigen Sprachdefinition bzw. Implementation mehr 
oder weniger zufällige Ergebnisse liefert. Diesen "C"-Quatsch sollte man 
nur verwenden, sofern einem langweilig oder das Ergebnis egal ist. 
Benutze besser eine richtige bzw. professionelle Programmiersprache, 
dann must Du dich nicht mit solchem Kinderkram herumschlagen.

Gruß,
Egbert
Gast #2634682
Lesenswert?

Zurück zu meinem Problem:
Dieses befand sich zwischen Tastatur und Stuhllehne.
Wenn time_us = 5.000 und clk = 8.000.000 (Punkt = 1000er Trennzeichen) 
hat man bei der Berechnung von
(time_us * clk) eigentlich das Ergebnis von 40.000.000.000 . Das passt 
aber in einen unsigned long mit 2^32-1=4.294.967.295 nicht rein. 
Überlauf, anderes Ergebnis...

Ein wenig umgestellt, um die Wertebereiche einzuhalten und schon 
funktionierts:
1
ticks = ((clk/1000000)*time_us)/divider
#2634719
Lesenswert?

Juri schrieb:

> Ein wenig umgestellt, um die Wertebereiche einzuhalten und schon
> funktionierts:
>
1
ticks = ((clk/1000000)*time_us)/divider

Das Problem könnte jetzt höchstens noch sein, dass du bei clk/1000000 zu 
viel verlierst. Bei deinen 8Mio geradeaus ist das kein Problem. Bei 
anderen Frequenzen mag das aber zu einem werden. Dann müsste man zb mal 
untersuchen, ob man nicht die Division auf 2 mal aufteilt

Ala
1
  ticks = ((clk/1000)*time_us/1000)/divider;

Reine Mathematik hat mit den realen Gegebenheiten in einem Computer 
manchmal nur wenig zu tun.

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