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


von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Bernhard S. (bernhard)


Angehängte Dateien:

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

von peter dannegger (Gast)


Angehängte Dateien:

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

von peter dannegger (Gast)


Angehängte Dateien:

Lesenswert?

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


Peter

von peter dannegger (Gast)


Angehängte Dateien:

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

von Steven Kienast (Gast)


Lesenswert?

krass. Fehlt mir nur noch das Wurzelziehen O_O

von Bernhard S. (bernhard)


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

von Bernhard S. (bernhard)


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

von Bernhard S. (bernhard)


Lesenswert?

Das Wurzelziehen (aus einer Zahl, hat nichts mit Floristik zu tun)


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

von Wolfgang (Gast)


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

von Dirk S. (Gast)


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ß

von Bernhard S. (bernhard)


Lesenswert?

Vielleicht Division durch NULL?  ;-)

von Peter D. (peda)


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

von Andy (Gast)


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

von Alex H. (hoal) Benutzerseite


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"

von Bernhard S. (bernhard)


Angehängte Dateien:

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

von Bernhard S. (bernhard)


Angehängte Dateien:

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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.