Forum: Mikrocontroller und Digitale Elektronik Runden auf 0 bzw. 5


von Florian M. (flomll)


Lesenswert?

Habe lange gesucht, jedoch nichts wirklich brauchbares gefunden.

Wie kann man einen Wert auf 0 bzw. 5 runden? Notwendig ist dabei, dass 
ich gezielt auf bzw. abrunden kann.

Beispiele:

Rechtsdrehen -> (aufrunden)
41 auf 45
42 auf 45
43 auf 45
44 auf 45
45 auf 45

46 auf 50
47 auf 50
48 auf 50
48 auf 50
49 auf 50
50 auf 50

Linksdrehen -> (abrunden)
41 auf 40
42 auf 40
43 auf 40
44 auf 40
45 auf 40

46 auf 45
47 auf 45
48 auf 45
48 auf 45
49 auf 45
50 auf 45

Das ganze ist für eine Steuerung mit eine berührungssensitiven Kreis.

von Noah (Gast)


Lesenswert?

integerdivision durch 5 und dann wieder mit 5 multiplizieren?

für den aufruden-fall dann noch 5 hinzuaddieren.

von Florian M. (flomll)


Lesenswert?

So schnell kanns gehen! :-)

Habe jetzt doch eine Lösung gefunden, die ich euch natürlich nicht 
vorenthalten will.


Rechtsdrehen:
1
U16 roundup05(U16 val){
2
  double temp = (double)(val/10.0);  // transform in to floating point value
3
  temp = temp * 2;
4
  return (U16)((ceil(temp)/2)*10);
5
}
6
7
U16 rounddown05(U16 val){
8
  double temp = (double)(val/10.0);  // transform in to floating point value
9
  temp = temp * 2;
10
  return (U16)((floor(temp)/2)*10);
11
12
}

von Turbo J (Gast)


Lesenswert?

Dazu eignet sich der Divisionsrest, auch Modulo genannt.
Aufrunden:
1
i+=4;
2
i-= i%5;

Abrunden normal:
1
i-=i%5;


Dein etwas merkwürdig spezifiziertes "Abrunden":
1
i-=1;
2
i-=i%5;

von Florian M. (flomll)


Lesenswert?

@ Noah: Wäre zwar eine sehr gute Lösung, jedoch bei runden Zahlen würde 
er um 5 weiter springen.

Beispiel: (falsch)
40 / 5 = 8

8 * 5 = 40

40 + 5 = 45

Beispiel: (richtig)

40 -> 40

von vip (Gast)


Lesenswert?

Noah schrieb:
> integerdivision durch 5 und dann wieder mit 5 multiplizieren?
>
> für den aufruden-fall dann noch 5 hinzuaddieren.

Fast. 4 gehören davor dazuaddiert.

Florian Müller schrieb:
> Beispiel: (richtig)
>
> 40 -> 40

40+4=44
44/5=8
8*5=40

41+4=45
45/5=9
9*5=45

unsigned int myceil (unsigned int c){
    return (((c+4)/5)*5);
}

unsigned int myfloor (unsigned int c){
    return ((c/5)*5);
}

Florian Müller schrieb:
> U16 roundup05(U16 val){
>   double temp = (double)(val/10.0);  // transform in to floating point value
>   temp = temp * 2;
>   return (U16)((ceil(temp)/2)*10);
> }
>
> U16 rounddown05(U16 val){
>   double temp = (double)(val/10.0);  // transform in to floating point value
>   temp = temp * 2;
>   return (U16)((floor(temp)/2)*10);
>
> }

Float und math.h auf µC? Dann doch lieber meine Lösung oder die von 
Turbo. Nur die Compileroptimierung solltes du berücksichtigen, die 
könnte bei meiner Lösung auf die Idee kommen, die Division und die 
Multiplikation rauszukürzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.