Werte umrechnen

Gast #410707
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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.