Werte umrechnen

Gast #410707
Lesenswert?

Hallo,

ich habe folgendes Problem:

Ich muss einen Wert in einen anderen umverteilen.  Die Werte von 20 bis
36 sollen belegt werden.
Aus einer anderen Berechnung bekomme ich Werte zwischen 0 und 255.
Jetzt muss ich diese 256 Werte auf die 17 Werte von 20 bis 36
aufteilen.
Die Werte von ca. 100 bis 156 sollen allerdings immer dem Wert 18
entsprechen. Dadurch kommt eine gewisse Nichtlineraität ins Spiel...
Ohne die Nichtlinearität kein Problem...aber mit??

Wie kann ich dies in C möglichst SCHNELL bewerkstelligen?

Im Moment mache ich es ungefähr so: (Die Werte stimmen nicht, nur ein
Bsp)
if (wert < 10)
    {
    ee = 20;
    }
if ((wert >= 10) && (wert <= 20))
    {
    ee = 21;
    }

Diese Art ist mir aber zu aufwendig, da ich alle Werte (10,20...usw.)
von Hand berechnen muss. Das ist in diesem Beispiel relativ schnell
passiert, aber wie gehts einfacher? Kann mir da jemand weiterhelfen?
Wie würdet ihr sowas machen?
Persönliche Seite #410708
Lesenswert?

Du brauchst eine Abschnittsweise definierte Funktion:
1
float m1, m2;
2
int b1, b2, y;
3

4

5
if (x < 100) {
6
  y = m1 * x + b1;
7
} else if (x > 156) {
8
  y = m2 * x + b2;
9
} else {
10
  y = 18;
11
}

m1, m2, b1, b2 musst du dir mit 2 Punkten, die auf der Geraden liegen
ausrechnen. (m = Steigung, b = y-Achsenabschnitt) b1 währe in deinem
Fall z.B. 20.
Gast #410711
Lesenswert?

Das mit der abschnittsweisen Funktion hab ich schon probiert. Leider
führt das teilweise zu einem verschobenen Ergebnis, da das Runden nicht
ganz hinhaut, aber vielen Dank für den Tipp. Sie erfüllt den Zweck in
dieser Aufgabe. Auf so eine einfache Lösung bin ich im ersten Moment
nicht gekommen...

Tabelle ist schön und recht bei 256 Elementen, aber wie gesagt, gibt
auch größere Beispiele bei meinen Problemen...

DANKE
#410712
Lesenswert?

> da das Runden nicht ganz hinhaut

Im vom Peter geposteten Code wird überhaupt nicht gerundet.
C-Standard ist, dass bei einer Umwandlung von double zu
int, die Nachkommastellen einfach abgeschnitten werden.
Wenn du auf runden aus bist, musst du eine Rundungskorrektur
anbringen:

  y = m1 * x + b1 + 0.5;

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