Forum: Compiler & IDEs Werte umrechnen


von fernsehkind (Gast)


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?

von Peter S. (peter) Benutzerseite


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.

von bla (Gast)


Lesenswert?

wert/16 + 20

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

Da's noch keiner geschrieben hat: die Tabelle ist natürlich die
schnellste Lösung.  Für 256 Elemente normalerweise auch kein
Problem, wenn man sie im ROM ablegt.

von fernsehkind (Gast)


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

von Karl H. (kbuchegg)


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;

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.