www.mikrocontroller.net

Forum: Projekte & Code DIVISION 32 BIT / 32BIT Beispiel (Assembler) ATmega8


Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Eine mögliche Variante für die Division

einer 32-Bit Zahl durch eine 32-Bit Zahl.


Diese Divisions-Routine wurde in Assembler geschrieben und ist nicht
nur für einen ATmega8 geeignet.


Bernhard

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
In diesem Beispiel habe ich die Divisionsroutine als Funktion
umgeschrieben.

Temp1...4 Divident (0...4.294.967.295)
Temp5...8 Divisor  (1...4.294.967.295)

Das Divisionsergebnis befindet sich anschließend in:

Temp1...4 Quotient (0...4.294.967.295)

In dieser Form gestalte ich gern Funktionen, da sich diese anschließend
wunderbar aneinander reihen lassen.

Bsp:
Eine Funktion multipliziert einen Wert mit 1000
die nächste dividiert das Ergebnis durch 1024


Bernhard

Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oftmals will man das Ergebnis gerundet haben, dazu addiert man vorher
die Hälfte des Divisors.

Und oft interessiert einen auch der Rest.

Anbei ein Code für beides.


Peter

Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn man es ein bischen schneller will, kann man noch optimieren, je
nachdem vieviel Bytes der Divisor groß ist (siehe Anhang).


Peter

Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und auch die Multiplikation kann man noch optimieren, da ja ein Faktor
nur 16-Bittig sein darf, wenn kein Überlauf erfolgen soll.

D.h. es reicht eine 32Bit * 16Bit Multiplikation aus, wo man bei Bedarf
die Faktoren vertauscht.

Im Anhang der Code.


Peter

Autor: Steven Kienast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
krass. Fehlt mir nur noch das Wurzelziehen O_O

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peter dannegger

Danke für Deine wertvolle Ergänzung. Habe mir Deine Routinen gerade
angeschaut.

>Oftmals will man das Ergebnis gerundet haben, dazu addiert man vorher
>die Hälfte des Divisors.

Ich frage mich immer wieder, wie man auf solche eleganten Lösungen
kommt?

Mir fällt es immer sehr schwer, solche komplizierten Berechnungen zu
deuten, wenn ich das Prinzip noch nicht verstanden habe.

Bernhard

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Steven Kienast

>krass. Fehlt mir nur noch das Wurzelziehen O_O

Wie wärs, wenn Du Dir darüber Gedanken machst, Dich mit der Theorie
befasst und anschließend über dieses Thema einen Beitrag verfasst?

Bernhard

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Wurzelziehen (aus einer Zahl, hat nichts mit Floristik zu tun)


http://www.mikrocontroller.net/forum/read-4-341231.html

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo (auch wenn der Beitrag schon etwas älter ist)

habt ihr evtl. auch noch eine Assemblerroutine für die Division von 2 
Floats?
Hab mir vor einiger Zeit eine Routine zur Float-Multiplikation 
geschrieben. Mit der Division hakt es irgendwie noch. Müsste man für 24 
"gültige" Bits ernsthaft den Dividend auf 48 Bit erweitern, oder steh 
ich einfach nur aufm Schlauch?

Gruß
Wolfgang

Autor: Dirk S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab die Divisions-Routine im avr studio 4 mal durchlaufen lassen, 
aber irgendwie nimmt die kein Ende - Endlosschleife ? Muss man im avr 
studio noch vorher was umstellen oder so ?

gruß

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht Division durch NULL?  ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk S. wrote:
> Hallo,
>
> ich hab die Divisions-Routine im avr studio 4 mal durchlaufen lassen,
> aber irgendwie nimmt die kein Ende - Endlosschleife ?

Ja, alle MC-Programme sind doch endlos.

Vielleicht mal nen Brechpunkt setzen?


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Hat denn jemand von euch eine echte 32 Bit Multiplikation mit 64 Bit 
Ergebnis in Assembler ? Ich müsste Werte grösser als 25 000 000 
miteinander Multiplizieren. Aber wo ich auch suche das grösste war 
bisher 24 * 24 Bit was ich gefunden habe.
Wäre dankbar für jede Hilfe.

Gruß, Andy

Autor: Alex H. (hoal) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:
> Aber wo ich auch suche das grösste war
> bisher 24 * 24 Bit was ich gefunden habe.

Hättest du auch mal direkt in dem Forum geschaut, wo du den Beitrag 
geschrieben hast...
Beitrag "Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen"

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@alle

ein Beispiel für eine Division 32Bit Zahl durch eine 16Bit Zahl 
unsigniert.

Quelle: http://www.avr-projekte.de

Hat jemand eine Idee, wie man diese Rotine erweitern könnte auf:

- signiert, unsigniert
- signiert, signiert
- unsigniert, signiert

signiert= vorzeichenbehaftet

Danke

Bernhard

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So könnte eine Divisions-Routine aussehen für 2 signierte
Zahlen 32-Bit und 16-Bit.

Ist nicht sehr elegant, aber funktioniert.

Sicherlich gibt es bessere Lösungen.

Bernhard

: Bearbeitet durch User

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.