DIY FP - Implementierung von Gleitkomma-Mathematik auf einem Mikrocontroller ohne Hardware-FPU


8

Ich arbeite an einem kleinen persönlichen Projekt (das auf einen Parallax-Propeller abzielt, aber dies sollte ziemlich verallgemeinerbar sein) , das Gleitkomma-Mathematik benötigt.

Der Mikrocontroller, mit dem ich arbeite, verfügt weder über ein natives Gleitkomma noch über eine Standard-Gleitkommabibliothek.

Gibt es gute Ressourcen oder Tutorials zur Implementierung von Software-Gleitkomma-Mathematik? Am besten auf wirklich begrenzten Ressourcen (ich habe nicht einmal einen Stapel!).


Ich möchte doublegroße Schwimmer unterstützen. Der Propeller ist eine 32-Bit-MCU, daher muss ich für jeden Schwimmer mehrere Variablen verwenden.

Ich weiß, dass es eine Software-Gleitkomma-Bibliothek für den Propeller gibt, aber sie unterstützt nur singleSchwimmer mit Größe.

Nein, ich brauche wahrscheinlich keine wirklich doublegroßen Schwimmer, aber das klingt nach einem wirklich interessanten Projekt. Der halbe Grund, warum ich das tun möchte, ist, dass ich auf dem Weg viel lernen werde.


Welcher Compiler? Ich habe es vielleicht verpasst, aber ich sehe nicht, welche Sprache Sie verwenden.
Kortuk

@Kortuk - Ich persönlich ziele auf einen Parallax-Propeller, also ist es entweder Spin oder Asm. Ich denke jedoch, dass dies nicht zu sprachspezifisch sein sollte. Angenommen, ich habe die allgemeinen Operationen (+ - / * Bitverschiebung, bitweise und / oder / etc ..).
Connor Wolf

Welche Operationen müssen Sie implementieren? Wenn Sie nur addieren, subtrahieren und multiplizieren möchten und sich keine Sorgen über Randfälle, NaNs usw. machen, sollte es ziemlich trivial sein, dies zu implementieren. Ich habe es in der Vergangenheit für 8-Bit-Mikrocontroller gemacht und es ist keine Mammutaufgabe, selbst wenn Sie alles in asm machen.
Paul R.

1
Wie Sie sagen, werden Sie unterwegs viel über die Implementierung von Gleitkommaoperationen lernen.
Paul R.

3
Vielleicht brauchen Sie keinen Gleitkomma . Wenn Sie nur Bruchzahlen benötigen, kann auch eine Festkomma-Arithmetik mit dezimalem (tatsächlichem Binär-) Punkt, der um einige Stellen nach links verschoben ist, ausreichen. Können Sie mehr über Ihre Bewerbung erzählen?
Curd

Antworten:


4

Wenn du es selbst machen willst, würde ich sagen, mach es einfach.

Ich denke, Sie werden nicht zu viele Ressourcen oder Tutorials finden, weil es nicht viel gibt.

Hier ist eine Übersicht:

  • Addieren / Subtrahieren:
    Wenn sich Exponenten zu stark unterscheiden (mehr als die Mantisse Bits hat): Geben Sie
    einfach den Wert mit größerem Exponenten zurück (wenn dies der Subtrahend ist: negieren)

    Wenn Exponenten ähnlich sind:
    Verschieben Sie die Mantisse mit kleinerem Wert um die Differenz der Exponenten und addieren / subtrahieren Sie sie von anderen Mantissen (unter Verwendung der Festkomma-Arithmetik).
    wenn das Ergebnis nicht 0 ist. Verschieben Sie die Mantisse nach oben, bis MSBit des Ergebnisses 1 ist, und dekrementieren Sie den Exponenten um den gleichen Betrag

  • Multiplikation / Division:
    Multiplizieren / Dividieren von Mantissen (unter Verwendung von Festkomma-Arithmetik) und Addieren / Subtrahieren von Exponenten


2

Sie sollten in der Lage sein, diese Gleitkomma-Bibliothek mit mehrfacher Genauigkeit auf dem Propeller mit Catalina C oder gcc zu verwenden. Für viele Anwendungen kann es jedoch zu langsam sein.


Kann C-Code auf dem Propeller mit Spin oder Prop-Asm zusammenarbeiten? Wenn nicht, könnte ich versuchen, es in Spin zu übersetzen. Zum Glück brauche ich nicht viel Geschwindigkeit. Realistisch gesehen muss ich 7 Operationen bei 2 Hz durchführen.
Connor Wolf

2
Oh Mann, die Quelle allein ist 1,1 MB, gezippt . Ich denke, es ist ein bisschen übertrieben. Gibt es einfachere Möglichkeiten?
Connor Wolf

2
Noch wichtiger ist, dass es in dieser Bibliothek (1) um Gleitkommazahlen mit beliebiger Genauigkeit geht (keine native Größe wie 32-Bit und 64-Bit) und (2) um Linux-Compiler auf Intel-, AMD- und MIPS-Prozessoren mit i386 und x64. In den Quellordnern werden "arm" und "generic" erwähnt, aber ich würde hier nicht beginnen.
Kevin Vermeer

2

Es sieht so aus, als hätte diese Frage mehr Verständnis als die Lösung des Problems gesucht, daher ist dies möglicherweise nicht die nützlichste Antwort, sondern nur der Vollständigkeit halber

http://code.google.com/p/propgcc/wiki/PropGccCompileOptions

Dies impliziert, dass die Propellerversion von GCC Gleitkomma-Unterstützung bietet, einschließlich Doppel.

GCC und seine Compiler-Bibliotheken sind natürlich Open Source, obwohl es möglicherweise eine echte Lernkurve gibt, bevor Sie sehen können, was der Code tut.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.