Forum: Mikrocontroller und Digitale Elektronik Algorithmus von Fließkomma zu Festkomma umwandeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von John Doe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moin Moin,
ich möchte einen Algorithmus, der aktuell in Fließkomma implementiert 
ist, in Festkomma rechnen. Leider habe ich auf diesem Gebiet wenig 
Erfahrung, weshalb ich derzeit auf der Suche nach einer Quelle 
(möglichst Online) bin, die mir hier etwas weiterhelfen kann. Also Quasi 
ein kleiner Leitfaden für die Übersetzung Fließkomma->Festkomma. Würde 
mich über ein paar hilfreiche Informationen freuen! :)

Mit freundlichen Grüßen
John

von Wegstaben V. (wegstabenverbuchsler)


Bewertung
0 lesenswert
nicht lesenswert

: Bearbeitet durch User
von John Doe (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Was fehlt dir denn an Informationen? Ich bin auf der Suche nach 
Skripten, Büchern usw. die sich mit dieser Thematik beschäftigen, z.B 
wie die Normierungen/Skalierungen durchzuführen sind.

von Jan H. (j_hansen)


Bewertung
0 lesenswert
nicht lesenswert
John Doe schrieb:
> Was fehlt dir denn an Informationen? Ich bin auf der Suche nach
> Skripten, Büchern usw. die sich mit dieser Thematik beschäftigen, z.B
> wie die Normierungen/Skalierungen durchzuführen sind.

Das ist ja nicht gerade Raketenphysik. Diese paar Informationen auf ein 
Skriptum oder gar Buch aufgeblasen stelle ich mir sehr langatmig vor.

von rmu (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ob und wie man da vorgeht hängt mMn stark vom Algorithmus ab. Manche 
eignen sich gar nicht für Fixkomma.

Explorativ könnte man den Algorithmus bzw. einige Iterations-Schritte 
davon (falls das was iteratives ist) in einer Tabellenkalkulation bauen 
und dann sukzessive anfangen die einzelnen Größen auf eine fixe Anzahl 
Nachkommastellen zu runden.

Analytisch würde man sich alle Berechnungen anschauen, den Wertebereich 
und die Genauigkeit der einzelnen Größen herausfinden bzw. abschätzen 
und danach die Datentypen bzw. das Komma festlegen. Overflows sollte man 
vernünftig behandeln wenn sie vorkommen, sonst stürzt wieder eine Rakete 
ab.

Wenn man alle Details wissen will wird man sich den Knuth TAOCP Teil 2 
o.ä. antun müssen.

von Max G. (l0wside) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ich stand vor dem gleichen Problem. Ein paar Hinweise dazu:
* In einen long passt ziemlich viel rein, und das kann auch ein 
16-Bitter in endlicher Zeit rechnen
* Divisionen durch Multiplikation und anschließenden Rechtsshift 
ersetzen, außer es geht gar nicht anders (variabler Nenner).
* Wertebereiche prüfen, Wertebereiche prüfen, Wertebereiche prüfen. 
Überläufe sind die Hölle beim Debuggen.
* Auf der anderen Seite den Wertebereich eines Long (32 Bit auf real 
existierenden Systemen) immer ganz ausnutzen, um keine Genauigkeit zu 
verlieren.
* Bitshifts kosten quasi keine Laufzeit, im Zweifelsfall lieber einen 
mehr einbauen.
* Ich habe die Rechenschritte zuerst in einem Excel-Sheet 
aufgeschrieben: in der ersten Spalte die Beschreibung, was da passiert; 
in der zweiten den Schritt per Fließkomma; in der dritten dann mit der 
ABRUNDEN-Funktion per Festkomma. In der vierten dann mittels 
Zweierlogarithmus, wie viele Bits der aktuelle Wert belegt.
* In diesem Excel-Sheet kann man dann mit den Eingangsdaten spielen und 
sieht ziemlich schnell, wo es zu Überläufen kommt.
* Für komplexere Funktionen (z.B. Logarithmus) kann man entweder eine 
Tabelle nehmen (wenn man genug Speicher hat) oder eine 
Taylorreihenentwicklung machen. Da kommt man mit zwei, drei Gliedern 
schon ziemlich weit.

Wenn ich mich recht erinnere, kann Matlab so was auch automatisch 
generieren. Allerdings nur Matlab, nicht Octave oder SciLab.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Max G. schrieb:
> * Wertebereiche prüfen, Wertebereiche prüfen, Wertebereiche prüfen.
> Überläufe sind die Hölle beim Debuggen.
> * Auf der anderen Seite den Wertebereich eines Long (32 Bit auf real
> existierenden Systemen) immer ganz ausnutzen, um keine Genauigkeit zu
> verlieren.

Deshalb ganz genau prüfen, ob float wirklich nicht geht. Der Zeitaufwand 
zum Umstellen und Debuggen ist immens.
Besonders bei PID-Regelungen lohnt sich float eigentlich immer. Heutige 
MCs und Compiler sind in der Regel schnell genug und haben auch 
ausreichend RAM.

Ich hab mich auch früher lange Zeit mit Ganzzahl abgequält, das muß man 
sich nicht antun.

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]
  • [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.