mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 array multiplizieren


Autor: Ulf Cramme (parabol1337)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute

hab da mal wieder  n kleines Problem.


Ich habe 2 Arrays a und b mit folgenden Inhalten:

a[1]=1;
a[2]=2;
a[3]=3;
a[4]=8;

b[1]=0;
b[2]=5;
b[3]=7;
b[4]=0;



also 1238x570=705660;

ich würde so vorgehen

a[4]*b[1]=c[0];
a[3]*b[1]=c[1];
a[2]*b[1]=c[2];
a[1]*b[1]=c[3];


nur hab ich da ein Problem was mache ich mit dem übertrag?

wie würdet ihr vorgehen

schöne Grüße Ulf

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vom Zweck der Übung weiß ich jetzt nicht...

Aber ansonsten: Genau wie auf dem Papier: Aufschreiben und auf die 
nächste Stelle addieren.
c[4] = a[4] * b[4];
ü = mod(c[4],10);
c[4] = c[4] - 10*ü;

c[3] = a[3] * b[3] + ü;
ü = mod(c[3],10);
c[3] = c[3] - 10*ü;

...

So sähe das in Pseudocode aus.

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe gar nicht, warum die Code-Formatierung nicht den 
Variablennamen "ü" mag. Dabei nenne ich Variablen doch immer 
"Pröttgenkrügel" oder so.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicolas S. wrote:
> Vom Zweck der Übung weiß ich jetzt nicht...
>
> Aber ansonsten: Genau wie auf dem Papier: Aufschreiben und auf die
> nächste Stelle addieren.
>
>
> c[4] = a[4] * b[4];
> ü = mod(c[4],10);
> c[4] = c[4] - 10*ü;
> 
> c[3] = a[3] * b[3] + ü;
> ü = mod(c[3],10);
> c[3] = c[3] - 10*ü;
> 
> ...
> 
>
> So sähe das in Pseudocode aus.

Nicht wirklich, aber fast. Mittels mod (=modulo) kannst du nicht den 
Übertrag bestimmen. Der Übertrag ist ganz einfach die Zahl durch 10 
dividiert. Modulo kommt erst ins Spiel, wenn du den Teil haben willst, 
der nach Abzug des Übertrags übrig bleibt.

@Ulf
Und der Modulo Operator ist in C ganz einfach das %.
    a = 10 % 7;
    b = 10 / 7;

b wird 1, a wird 3.
denn: 7 ist in 10 1 mal enthalten und 3 bleiben Rest.

Frage: Was ist daher

    23 / 10    bzw.
    23 % 10

(das erste ist 2, das zweite ist 3. 'Zufällig' wäre in deiner Anwendung 
der Übertrag bei so einem Zwischenergebnis 2, während die sich zu 
merkende Stelle 3 wäre :-)

Autor: Ulf Cramme (parabol1337)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich hab mir da smal so durch den kopf gehen lassen... mir ist 
aufgefallen, das ist alles sehr aufwendig

z.B.


a1=6
a2=7

b1=8
b2=9


d1=a2xb2  | 7*9=63
üd1=d1/10 | 63/10=6
c1=d1%10  | 63%10=3

d2=a1xb2  | 6*9=54
üd2=d2/10 | 54/10=5
c2=d2%10  | 54%10=4


dann müssen noch dir überträge dazuaddiert werden. das macht ne menge 
aufwand wenn man 2 4stellige zahlen hat

=/

gibt es vielleicht eine routine dafür, ich will ja das rad kein 2. mal 
erfinden

danke schon mal

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>gibt es vielleicht eine routine dafür, ich will ja das rad kein 2. mal
>erfinden

Warum hältst du die Zahlen nicht in normalen Variablen? Und machst nur 
zur LCD/UART Ausgabe eine Wandlung nach ASCII...

Autor: Ulf Cramme (parabol1337)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ja wäre mir auch lieber... nur ich bekomme die daten vom UART im 
ASCII Format. Das ganze soll eine Leistungsanzeige werden. das 
Laderegler sendet mir die daten in diesem Format. Jetzt muss ich Strom 
und Spannung multipliezieren und um eine LCD Anzeige ausgeben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ulf Cramme wrote:
> Hallo ja wäre mir auch lieber... nur ich bekomme die daten vom UART im
> ASCII Format.

Ja und?

Die kann man doch auch nach einer richtigen Zahl wandeln!

Die Funktion atoi ist schon lange erfunden. Wie wärs mal mit etwas 
C-Grundlagenstudium.

(Ich dachte bisher, das ganze wäre eine Hausübung! Kein Mensch tut sich 
heute noch BCD Arithmetik an, wenns nicht unbedingt sein muss weil er 
praktisch 'unendlich große' Zahlen verarbeiten können muss.)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.