Forum: Mikrocontroller und Digitale Elektronik float ersetzen


von DS (Gast)


Lesenswert?

Hallo,

ich versuche einen Wert mit 256 auf 124 LEDs zu mappen. D.h. Der erste 
muss 0 sein der letzte 255

Das hier tut genau das was es soll:
1
float Hfloat = 0;
2
for (...)
3
{
4
  Hfloat = Hfloat + 256.0/124.0;
5
  H = (int)round(Hfloat);
6
  ...
7
}

Kann ich mir den float irgendwie sparen, oder gibt es etwas 
sparsammeres?

Vielen Dank!

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

http://homepage.univie.ac.at/Heinz.Kabelka/edv-ueb/variabl.htm

float braucht 4 Byte
unsigned character braucht 1 Byte
beachte: immer von 0..255 zählen sonst ist unsigned character zu klein

von Tom M. (Gast)


Lesenswert?

Stichwort Festkommaarithmetik

Die Sache ist etwas haklig, weil 124/255 kein endlicher Bruch ist. Du 
kannst es ja mal mit 487 implementieren.

uint8_t u2led (uint8_t v) {
 return v * (uint32_t) 487 / 1000;
 }

von Daniel A. (daniel-a)


Lesenswert?

Sofern ich mich nicht verrechnet habe:
1
uint_fast8_t Hfixed = 0;
2
for (...)
3
{
4
  H = (((uint_fast16_t)Hfixed++<<8)/62+1)>>1;
5
  ...
6
}

von Stefan F. (Gast)


Lesenswert?

Manchmal ist es Sinnvoll, solche Werte-Pärchen extern (z.B. mit Excel) 
vorzuberechnen und als Array abzulegen. Die Berechnung reduziert sich 
dann auf:

H=meinArray[Hfixed];

von Wolfgang S. (ws01)


Lesenswert?

DS schrieb:
> Hallo,
>
> ich versuche einen Wert mit 256 auf 124 LEDs zu mappen. D.h. Der erste
> muss 0 sein der letzte 255
...
> Kann ich mir den float irgendwie sparen, oder gibt es etwas
> sparsammeres?

Gibt es. Vielleicht gibt
https://de.wikipedia.org/wiki/Bresenham-Algorithmus
ja einen Anhaltspunkt. :-)

von Wolfgang (Gast)


Lesenswert?

DS schrieb:
> Kann ich mir den float irgendwie sparen, oder gibt es etwas
> sparsammeres?

Versuchs doch mal mit
1
33/16
 oder mit
1
1057/512

von Oldie (Gast)


Lesenswert?

Bin ich für diesen abgekürzten Neusprech zu blöd?

Willst du (A) 1...124 nach 0...255 konvertieren,
oder (B) von  0...255 nach 1...124 konvertieren?

Für beides kann man ohne Einsatz der float-, oder
double-Rechnung recht effektive Lösungen angeben.

Allerdings wird je eine Integer Multiplikation
(Unsigned 8 Bit * 8 Bit) benötigt:

(A)
1...124    -1    -> 0...123
0...123    << 1  -> 0...246
0...246    * 133 -> 0...32718
0...32718  >> 7  -> 0...255

(B))
0...255    *124  -> 0...31620
0...31620  >> 8  -> 0...123
0...123    +1    -> 1...124

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.