DIY FP - Implémentation de mathématiques à virgule flottante sur un microcontrôleur sans FPU matériel

8

Je travaille sur un petit projet personnel (ciblant une hélice Parallax, mais cela devrait être assez généralisable) qui nécessite des calculs en virgule flottante.

Le microcontrôleur avec lequel je travaille n'a pas de virgule flottante native ni de bibliothèque de virgule flottante d'origine.

Existe-t-il de bonnes ressources ou des didacticiels sur la mise en œuvre de logiciels mathématiques à virgule flottante? De préférence sur des ressources vraiment limitées (je n'ai même pas de pile!).


Je voudrais supporter doubledes flotteurs de taille. L'hélice est un MCU 32 bits, donc je vais devoir utiliser plusieurs variables pour chaque flotteur.

Je sais qu'il existe une bibliothèque de virgule flottante logicielle pour l'hélice, mais elle ne prend en charge que singledes flotteurs de taille.

Non, je n'ai probablement pas vraiment besoin doublede flotteurs de taille, mais cela ressemble à un projet vraiment intéressant. La moitié de la raison pour laquelle je veux le faire est que j'apprendrai beaucoup en cours de route.

Connor Wolf
la source
quel compilateur? Je l'ai peut-être manqué, mais je ne vois pas quelle langue vous utilisez.
Kortuk
@Kortuk - Je cible personnellement une hélice Parallax, ce sera donc Spin ou asm. Cependant, je pense que cela ne devrait pas être trop spécifique à la langue. Supposons que j'ai les opérations courantes (+ - / * bit-shifting, bitwise et / ou / etc ..).
Connor Wolf
Quelles opérations devez-vous mettre en œuvre? Si vous voulez simplement ajouter, soustraire et multiplier, et que vous ne vous inquiétez pas trop des cas marginaux, des NaN, etc., cela devrait être assez trivial de l'implémenter. Je l'ai fait pour les micro-contrôleurs 8 bits dans le passé et ce n'est pas une tâche gigantesque, même si vous le faites tout en asm.
Paul R
1
Eh bien, comme vous le dites, vous apprendrez beaucoup sur la mise en œuvre d'opérations en virgule flottante en cours de route.
Paul R
3
Vous n'avez peut-être pas besoin de virgule flottante . Si vous avez juste besoin de nombres fractionnaires, une arithmétique à virgule fixe avec un point décimal (binaire réel) décalé à certains endroits vers la gauche peut faire l'affaire. Pouvez-vous nous en dire plus sur votre candidature?
Curd

Réponses:

4

Si vous voulez le faire vous-même, je dirais juste le faire.

Je suppose que vous ne trouverez pas trop de ressources ou de tutoriel car il n'y en a pas beaucoup.

Voici un aperçu:

  • ajout / soustraction:
    si les exposants diffèrent trop (plus que la mantisse n'a de bits):
    renvoyez simplement la valeur avec un exposant plus grand (si c'est le subtrahend: négation)

    si les exposants sont similaires:
    décaler la mantisse de plus petite valeur par la différence des exposants et ajouter à / soustraire des autres mantisses (en utilisant l'arithmétique à virgule fixe)
    si le résultat n'est pas 0: décaler la mantisse jusqu'à ce que MSBit du résultat soit 1 et décrémenter l'exposant de la même quantité

  • multiplication / division:
    multiplier / diviser les mantisses (en utilisant l'arithmétique à virgule fixe) et ajouter / soustraire des exposants

fromage blanc
la source
2

Vous devriez pouvoir utiliser cette bibliothèque à virgule flottante à précision multiple sur l'hélice, avec Catalina C ou gcc. Cependant, cela peut être trop lent pour de nombreuses applications.

Leon Heller
la source
Le code C sur l'hélice peut-il interagir avec Spin ou prop-asm? Sinon, je pourrais essayer de le traduire pour tourner. Heureusement, je n'ai pas besoin de beaucoup de vitesse. De façon réaliste, je dois faire 7 opérations, à 2 hz.
Connor Wolf
2
Oh boy, la source seule est de 1,1 Mo, zippée . Je pense que c'est un peu exagéré. Existe-t-il des options plus simples?
Connor Wolf
2
Plus important encore, cette bibliothèque (1) concerne les virgules flottantes à précision arbitraire (pas la taille native comme 32 bits et 64 bits) et (2) elle cible les compilateurs Linux sur les processeurs Intel, AMD et MIPS i386 et x64. Il y a une mention de «arm» et «générique» dans les dossiers source, mais je ne commencerais pas ici.
Kevin Vermeer
2

Il semble que cette question a pris la tendance de chercher à comprendre plus qu'à résoudre le problème, donc ce n'est peut-être pas la réponse la plus utile, mais juste pour être complet

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

Implique que la version hélice de GCC a un support en virgule flottante, y compris les doubles.

GCC et ses bibliothèques de compilation sont bien sûr open source, bien qu'il puisse y avoir une vraie courbe d'apprentissage avant que vous puissiez commencer à voir ce que fait le code.

Chris Stratton
la source