Unterschiedliche Ergebnisse bei float und long

Gast #2634539
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
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 #2634614
Wenn wir dem egbert alles wegnehmen was in C geschrieben ist, kann er 
wieder mit dem Brummkreisel spielen. Und so einen Mist schreiben kann er 
dann auch nicht mehr.
Gast #2634682
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.