0 Daumen
647 Aufrufe

Aufgabe:

Ich habe hier eine Formel, die mit 4 Variablen eine Summe "SUM" berechnet.
Es handelt sich bei den Variablen um 8-Bit Hexadezimal-Werte (0x00-0xFF bzw. dezimal 0-255).
Die ganze Berechnung funktioniert natürlich auch genau gleich wenn man mit dezimal Werten arbeitet.

Variablen Namen: "A", "B", "C", "D"

Variablen A, B, und C haben einen Multiplikator:
Mult_A = 0xFFFFFF (dezimal 16777215)
Mult_B = 0xFFFF (dezimal 65535)
Mult_C = 0xFF (dezimal 255)

Die Formel dazu lautet:
A * Mult_A + B*Mult_B + C * Mult_C + D = SUM

Beispiel:
A = 0x0D (dezimal 13)
B = 0x95 (dezimal 149)
C = 0x49 (dezimal 73)
D = 0xC3 (dezimal 195)

Beispiel-Formel mit den eingesetzten Werten:
Hex:
0x0D * 0XFFFFFF + 0x95 * 0xFFFF + 0x49 * 0xFF + 0xC3 = 0x0D9548D8

Bzw. dezimal:
13 * 16777215 + 149 * 65535 + 73 * 255 + 195 = 227887320

So weit so gut, mit gegebenen Variablen kann man also problemlos eine Summe errechnen.
Nun aber zu meinem Problem bzw. zu meiner Frage:


Problem/Ansatz:

Wenn ich bei obiger Formel nur eine gegebene Summe aber unbekannte Variablen A, B, C, D habe:
Ist es möglich, die Formel entsprechend umzuwandeln, damit man die unbekannten Variablen errechnen kann?

Danke!

Avatar von

A, B, C, D habe:
Ist es möglich, die Formel entsprechend umzuwandeln, damit man die unbekannten Variablen errechnen kann?

Die nenne die Unbekannten direkt
a * m1 = Am1
A M1 + BM2 + CM3 + DM4 = SUM

Eine eindeutige Lösung gibt es nicht.
Es gibt unendlich viele Lösungen.

Oder habe ich was übersehen.

Oder habe ich was übersehen.

Ja - den eingeschränkten Wertebereich von A, B, C und D. Es gilt für alle \( 0 \le A \lt 256\) usw.

3 Antworten

0 Daumen
 
Beste Antwort

Hallo Martin,

Variablen A, B, und C haben einen Multiplikator:
Mult_A = 0xFFFFFF (dezimal 16777215)
Mult_B = 0xFFFF (dezimal 65535)
Mult_C = 0xFF (dezimal 255)

das ist ungewöhnlich! Üblich wäre MULT_A = 0x1000000, MULT_B = 0x10000 usw. aber gut, es geht auch so.

Es handelt sich bei den Variablen um 8-Bit Hexadezimal-Werte (0x00-0xFF bzw. dezimal 0-255).

Dann ist allerdings der Wertebereich der Summe eingeschränkt. Bestimmte Zahlen sind so nicht darstellbar. Z.B. der Bereich 65281 bis 65534. Beispiel:$$\text{SUM}=65280 = 255 \cdot \text{MULT\_C} + 255 \quad A=0,\space B=0, \space C=\text{0xFF},\space D=\text{0xFF} \\\text{SUM}=65281 = \space ? \\\text{SUM}=65535 = 1\cdot \text{MULT\_B} + 0 \cdot \text{MULT\_C} + 0 \quad A=0,\space B=1, \space C=0,\space D=0$$

Wenn die Summe gegeben ist, so teile diese mit Divisionsrest durch die Multiplikatoren. Beginne dabei mit dem größten Multiplikator. Der Parameter ist das Ganzzahlergebnis dieser Multiplikation und der Divisionsrest ist die neue Summe, die wieder durch den nächsten Multiplikator dividiert wird. usw.

Am Beispiel von 227887320:$$\begin{array}{r|r|r|l}\text{Sum}& M&\lfloor \text{Sum}/M\rfloor& \\\hline 227887320& 16777215& 13& 0x0D\\ 9783525& 65535& 149& 0x95\\ 18810& 255& 73& 0x49\\ 195& 1& 195& 0xC3\end{array}$$Die neue Summe \(s_{i+1}\) ist immer $$s_{i+1} = s_i - M_i \cdot\left\lfloor\frac{s_i}{M_i}\right\rfloor$$Melde Dich bitte, wenn etwas unklar ist. Und es wäre interessant zu erfahren, wie Du zu diesen 'Multiplikatoren' kommst!

Gruß Werner

Avatar von 48 k

Vielen Dank für die Hilfestellung Werner, das löst mein Problem!
Mir ist natürlich klar, dass man bei einer gegebenen Summe mit 4 Variablen eine Vielzahl von Variationen hat.
Mit dieser Herangehensweise kommt man aber immer auf exakt einmalige Werte für A, B, C und D.

Du hast auch Recht mit Deiner Annahme, dass die Multiplikatoren 0x1000000, 0x10000 und 0x100 sind, ich hatte hier irrtümlich falsche Werte verwendet.

Nachdem Du sagst "üblicherweise" und nachdem du das so souverän gelöst hast - wo hattest du mit solchen Multiplikatoren bereits zu tun?

Die ganze Rechenaufgabe kommt aus dem KFZ Bereich und beschreibt, wie ein Motorsteuergerät die Laufleistung des Fahrzeugs (in m) hochzählt, und aufgeteilt auf mehrere Byte Werte im EEPROM des Motorsteuergerät abspeichert.
Da das EEPROM mit 8-Bit Werten (0-255) rechnet, lassen sich größere Zahlen nur mittels solcher Berechnungsfunktionen abbilden.
Und jeder Fahrzeug- bzw. Elektronikhersteller kocht hier sein eigenes Süppchen.

Die Funktion dazu ist hier zu finden:
Siehe "Mileage of engine control unit"
http://www.diagprof.com/de/ecu_tipps_und_tricks/vag/motorelektronik/bosch/edc16u34


MfG Martin

Nachtrag:
Durch die Verwendung von korrekten Multiplikatoren (0x1000000 bzw 16777216, 0x10000 bzw. 65536, 0x100 bzw. 256) können auch alle Wertebereiche abgebildet werden.

Nachdem Du sagst "üblicherweise" und nachdem du das so souverän gelöst hast - wo hattest du mit solchen Multiplikatoren bereits zu tun?

Eine meiner Haupttätigkeiten im Beruf ist die Programmierung in C++. Und wenn Du mich dann fragst 'wo hattest du mit solchen Multiplikatoren bereits zu tun?', dann ist das etwa dasselbe, als ob Du einen Tischler fragst, wo er schon mal was mit Hammer und Nägeln zu tun hatte.

Da das EEPROM mit 8-Bit Werten (0-255) rechnet, lassen sich größere Zahlen nur mittels solcher Berechnungsfunktionen abbilden.

das ist weniger eine Frage des EEPROM, weil das rechnet sicher rein gar nicht, sondern der verfügbaren Möglichkeit dasselbe zu schreiben und zu lesen. Das wiederum hängt i.A. an der verwendeten Programmiersprache ab.

Die Funktion dazu ist hier zu finden: Siehe "Mileage of engine control unit"

Und die Programmiersprache, die hier verwendet wird, ist offensichtlich C. In den Funktionen getKM wird ein 4-Byte-Integer im sogenannten Big-Endian-Format aus dem Speicher gelesen. Wenn das Endian im EEPROM mit dem Endian der Plattform, auf der der Code läuft, übereinstimmen würde, könnte man die Funktion schreiben als

unsigned long getKM_1()
{
return *((unsigned long*)(dump+0x502));
}

damit wird der unsigned long einfach auf den Speicher 'gelegt' und gelesen. Setzt aber identische Endiness und eine Byte-Länge des unsigend long von 4 voraus. Und ersteres ist nicht überall gegeben. Z.B. nicht auf Windows-Maschinen.

Hinweis: da im Falle der 'üblichen Multiplikatoren' diese Potenzen von 256=0x100 sind, vereinfacht sich auch der Algorithmus, aus einem Wert die vier Bytes zu erzeugen.

In C sähe das z.B. so aus:

void toBigEndian(unsigned long value, unsigned char* addr)
{
  for ( int off = 3; off >= 0; --off, value >>= 8 )
  {
      *(addr + off) = (unsigned char)(value & 0xff);
  }
}

Die Funktion 'toBigEndian' schreibt einen Wert 'value' an die Adresse 'addr'. Das ist somit das Inverse zu getKM_1. Der Aufruf wäre dann z.B.:

toBigEndian( 227887320, dump+0x502 );

0 Daumen

es gibt unendlich viele varianten an summanden um eine summe zu bilden. bei 4 summanden kamst du 3 beliebig aus wählen und den fehlenden berechnen.

Avatar von 21 k

Eine prima Lösung.

0 Daumen

S=A+B+C+D und S sei gegeben. Jeder der Summanden A, B, C oder D hängt von jedem ab. Die Formel umzuwandeln, damit man die unbekannten Variablen A, B, C oder D errechnen kann, wird also nicht gelingen.

Avatar von 123 k 🚀

Danke für Euer rasches Feedback!

Ich habe mir so etwas natürlich gedacht, hatte aber die Hoffnung, dass sich das ganze eingrenzen bzw lösen lässt aufgrund der Tatsache, dass die einzelnen Variablen einen Maximal-Wert von 255 haben dürfen.

Wenn ich zB. die Summe SUM = 12345 habe, dann muss A und B ja 0 sein, sonst funktioniert die Formel nicht mehr

Ich habe mir so etwas natürlich gedacht, hatte aber die Hoffnung, dass sich das ganze eingrenzen bzw lösen lässt aufgrund der Tatsache, dass die einzelnen Variablen einen Maximal-Wert von 255 haben dürfen.

da hast Du völlig richtig gedacht. Es ist zwar nicht eindeutig, aber die Anzahl der möglichen Lösungen ist übersichtlich und kann sogar gleich 0 sein! (s. meine Antwort)

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community