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
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
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
Und wenn man es ein bischen schneller will, kann man noch optimieren, je nachdem vieviel Bytes der Divisor groß ist (siehe Anhang). Peter
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
krass. Fehlt mir nur noch das Wurzelziehen O_O
@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
@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
Das Wurzelziehen (aus einer Zahl, hat nichts mit Floristik zu tun) http://www.mikrocontroller.net/forum/read-4-341231.html
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
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ß
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
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
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"
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.