www.mikrocontroller.net

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


Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.