0 Daumen
360 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