Runden ohne float

#3988426
Lesenswert?
• ▲
▼
Marc D. schrieb:
> ergibt das einen Sinn ? 10 Bit ADC ergibt werte von 0-1023
> Multipliziert mit 100 ergibt das einen Bereich von 0-102300.

Eben, wie kommst du von diesen Ganzzahlen zu den

Klaus Rabke schrieb:
> 3.952

???

Allgemein: Ganzzahlwert, der durch Teilen Stellen verliert. Statt 
abschneiden runden geht indem du vorher die Hälfte des Teilers 
dazuaddierst.

Beispiel, du willst die beiden letzten Stellen weghaben:

(5051 + 50) / 100 = 5101 / 100 = 51
(5049 + 50) / 100 = 5099 / 100 = 50

Nachtrag: Sebi war schneller :-)
OP #3988432
Lesenswert?
• ▲
▼
@Marc D

Ich multipliziere * 100, weil ich hinterher durch 204.8 und später noch 
durch  2.05 teilen muss, mit * 100 kann ich zuerst durch 20480 und 
später mit 205 teilen.

Der Teil sieht jetzt so aus, funktioniert aber nicht wie gewünscht:
1
Enr = Gz / 20480;
2
Hstl = (Gz % 20480)/205;
3
Runden = (Hstl * 2);
4
Runden = Runden + 1;
5
Hstl = Runden / 2;
Persönliche Seite #3988654
Lesenswert?
• ▲
▼
Klaus Rabke schrieb:

> Ich multipliziere * 100, weil ich hinterher durch 204.8 und später noch
> durch  2.05 teilen muss, mit * 100 kann ich zuerst durch 20480 und
> später mit 205 teilen.


Davon hast du nicht gesagt. Macht aber in dem Kontext immer noch kein 
Sinn.

1023 (dein max. ADC Wert) * 100 = 102300
102300 / 20480 = 4,99x
4,99x / 205 = 0.024
Runden wir dann ist das Ergebnis = 0.
Das gilt dann auch für alle kleineren ADC werte.
Du kannst also gleich mit 0 Weitermachen und dir dann auch gleich
den ADC ersparen.

Ansonsten einfach kein float verwenden und nur mit int16_t bzw. int32_t
Rechnen.
102300 / 20480 = 4 weil das einfach stumpf abgeschnitten wird.
Gast #3988800
Lesenswert?
• ▲
▼
Wenn Du ADC*100 rechnen kannst (i32) dann kannst Du auch ADC*1000 
rechnen.

(ADC*1000 + 1024) / 2048

Bsp.:

ADC=1013

(1013 * 1000 + 1024) / 2048 (= 495,1289) = 495

ADC=1012
(1012 * 1000 + 1024) / 2048 (= 494,1406) = 494

Oder?

WS
Gast #3988816
Lesenswert?
• ▲
▼
Da kann man eine ganz klare Empfehlung aussprechen: Am großen Zeh 
spielen für Anfänger. Alles andere ist für den TO schlicht zu hoch.

Weder kann er lesen, noch was er liest verstehen oder danach handeln, 
noch verstehen was er will oder es korrekt ausdrücken.

Reine Zeitverschwendung.
Gast #3990642
Lesenswert?
• ▲
▼
Klaus Rabke schrieb:
> gibt es eine Möglichkeit, Werte ohne float zu verwenden zu runden?

Nein.
Runden ist immer der Vorgang, wo Nachkommastellen beseitigt und aus 
dem Ergebnis was ganzzahliges gemacht wird. Mit gewöhnlichen 
Integerzahlen gibt es sowas aus Prinzip nicht.

Ähem...es sei denn, du arbeitest mt FPGA's, wo bestimmte Sorten von 
Festkommazahlen definiert sind.

Ansonsten scheint mir dein Denkansatz schlichtweg kraus. Wenn du das 
richtige Skalieren nicht beherrschst, dann nimm float und fertig isses.

W.S.
Gast #3991193
Lesenswert?
• ▲
▼
Hallo W.S.,
man kann runden, wenn man Festkommazahlen benutzt. Also kann man mit 
Integerzahlen runden, wenn man weiß wie es geht.

Wenn ich also einen Interger*32 Wert habe, der das 1000-fache des 
Ergebnisses darstellt, kann ich runden. Sogar nach der zweiten Stelle.

Man braucht keinen Float, man braucht einen Algorithmus:

(ADC*1000 + 1024) / 2048

Gruß

WS

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.