Fliesskommazahlen in Assembler (Mega8)

Gast #37772
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
Gast #37773
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
#37774
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
Gast #37775
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
Gast #37776
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren