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.
integerdivision durch 5 und dann wieder mit 5 multiplizieren? für den aufruden-fall dann noch 5 hinzuaddieren.
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 | }
|
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; |
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.