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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.