Runden ohne float

#3988390
Lesenswert?

Hallo,

gibt es eine Möglichkeit, Werte ohne float zu verwenden zu runden?

Ich lese meinen 10 Bit AD-Wandler ein multipliziere * 100 für die 2 
Nachkommastellen. Kann ich die irgendwie Runden, das ich bei 3.952 nicht 
3 stehen habe sondern 4 ?
#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 :-)
#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.
Persönliche Seite #3988961
Lesenswert?

Klaus Rabke schrieb:
> Marc D. schrieb:
>> 4,99x / 205 = 0.024
>
> es ist nicht 4.99 / 205, es ist (102300 % 20480) / 205

Huch nun doch eine modulo Rechnung hast du auch nicht erwähnt.
Aber auch hier gilt das gleiche.

(102300 % 20480) / 205 = 99,41463414634146
oder mit Ganzzahltypen gerechnet 99.

Einfach float nicht benutzen und Glücklich sein.
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

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