Forum: Mikrocontroller und Digitale Elektronik Fliesskommazahlen in Assembler (Mega8)


von Jörn (Gast)


Lesenswert?

Wie berechnet man beim Mega 8 Fliesskommazahlen in Assembler?

Konkretes Problem:
Es sollen (umgerechnet in dezimal) 5-stellige Fliesskommazahlen
miteinander multipliziert oder dividiert werden.
Kennt von euch jemand einen Ansatz oder einen Link?
Kann ich evt. die Berechnung in einer anderen Programmiersprache viel
leichter lösen und die Ergebnisse in mein Assemblerprogramm einbinden?

Für jede Hilfe bin ich dankbar

von BernhardT (Gast)


Lesenswert?

Fliesskommazahlen in asm - Du bist ein maso oder ?
Jetzt hauen mir warscheinlich einige Könner eins auf die Nase (zu
Recht). Aber ich verwende eben gerade wegen dem unglaublichen Aufwand
den den Fliesskommazahlen brauchen lieber C. Damit aber der
Programmspeicher nicht Platz, nehme ich dann doch manchmal lieber ein
selbstdefiniertes Festkomma Format. Ich rechne einfach mit Int oder
Long etc. und muss dan allerdings das Komma selber setzen.
Bsp. 1,725 V = 1725 mV .
Gruß Bernhard

von Peter D. (peda)


Lesenswert?

Fliesskommazahlen werden in Assembler sehr selten verwendet. Das hat den
Grund, daß der Assembler keine Fliesskomma Symbole unterstützt, sondern
nur bis 32 Bit Ganzzahl.
Deshalb rechnet man in Assembler fast nur mit Ganzzahlen oder Festkomma
(=Ganzzahl der zehntel oder hundertstel, je nach gewünschter
Genauigkeit).

Und hat man den Divisions- oder Multiplikationsalgorithmus kapiert,
kann man ihn auch ganz leicht aufbohren. Für meinen Frequenzmesser habe
ich z.B. eine 56Bit/24Bit Division gemacht.

Du mußt nur beachten, zuerst die Multiplikationen und dann die
Divisionen.
Zum Runden bei der Division addiert man einfach die Hälfte des
Divisors.


Peter

von hebel23 (Gast)


Lesenswert?

Dazu empfehle ich das Buch:

Jorke, G.; Lampe, B.; Wengel, N.: Arithmetische Algorithmen in der
Mikrorechentechnik, 1. Auflage, VEB Technik Verlag Berlin 1989

Ist hier zwar für einen Z80 beschrieben, kann man aber natürlich auf
einen AVR portieren.

Gruß Andreas

von Gerd (Gast)


Lesenswert?

Also, man kann's auch komplizierter machen als es ist. Dezimalpunkte
wegdenken und in Integer rechnen. Dann Dezimalpunkt wieder hindenken.
Also z.B. 14,52 * 23,18 = 336,5736:

1.
1452 (dez) mit 2318 (dez) malnehmen, gibt 3365736 (dez)
(malnehmen wenigstens in 24-Bit programmieren)

2.
Binärergebnis in Dezimal umwandeln, Komma an der richtigen Stelle
setzen.

Die Methode in Assembler zu programmieren ist recht einfach und schlägt
zeitmäßig jede Hochsprachen-Fließkomma-Routine um Längen. Sowohl was
den Programmieraufwand angeht als auch was die nötige Debug-Zeit angeht
als auch in Sachen Resourcenfresserei als auch laufzeitmäßig.


MfG
Gerd

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.