math - Bibliothèque de points fixes C++?




fixed-point (7)

Je suis à la recherche d'une librairie de points fixes C ++ gratuite (Principalement pour une utilisation avec des périphériques embarqués, pas pour des maths de précision arbitraires). Fondamentalement, les exigences sont les suivantes:

  • Pas de temps d'exécution inutile: tout ce qui peut être fait au moment de la compilation, devrait être fait au moment de la compilation.
  • Possibilité de basculer de manière transparente entre le code fixe et le virgule flottante, sans surcharge inhérente.
  • Fonctions mathématiques à virgule fixe Il n'y a pas grand-chose à utiliser un point fixe si vous avez besoin de faire des va-et-vient pour prendre une racine carrée.
  • Petite empreinte.

Aucune suggestion?


Answers

Il existe un projet de bibliothèque mathématique à point fixe open-source qui peut être trouvé en suivant les liens ci-dessous:

C'est une bibliothèque statique C avec une interface de classe C ++ pour les utilisateurs C ++, elle implémente les fonctionnalités suivantes: Trig. Fonctions: sin, cos, tan, asine, acos, atan, atan2 Arithmétique saturée: sadd, ssub, smul, sdiv Autres fonctions: sqrt, exp

Il ne prend en charge que 16.16 type de données à virgule fixe .

C'est un projet open-source développé activement (à la recherche de développeurs intéressés).


Peut-être que vous pourriez essayer les bibliothèques GMP ou MPFR. Je suis sûr qu'ils satisferont vos besoins de performance, mais peut-être qu'ils sont trop pour vos besoins et que vous voulez quelque chose de plus léger. Quoi qu'il en soit, regardez ici:

Bibliothèque GMP

ou ici:

Bibliothèque MPFR



J'ai un joli petit en-tête c ++. Vous pouvez le trouver sous sweet::Fixed . Définissez simplement typedef sweet :: Fixed MyFloat; et l'utilise comme n'importe quelle autre valeur flottante. Ou échangez le type de flotteur que vous voulez plus tard. La classe a deux valeurs de 64 bits. Un pour la partie entière et pour la fraction.

J'ai un petit en-tête de classe c ++ 11 fixe dans le sweet.hpp appelé fixed.hpp . Il utilise 32 bits pour les deux parties.

typedef float MyFloat;         // This will feel the same
typedef sweet::Fixed MyFloat;  // like this

Voici une bibliothèque open-point à point fixe sur GitHub:

https://github.com/mbedded-ninja/MFixedPoint

Il prend en charge les nombres à virgule fixe 32 bits et 64 bits (avec un quotient arbitraire) et les deux rapides (tout est modélisé, mais un peu plus manuel) et les nombres à virgule fixe lente (plus automatique, mais plus lent).

Il est orienté vers les plates-formes embarquées, mais je l'ai utilisé sur les deux microcontrôleurs et Linux sans aucun problème.


Je n'ai jamais utilisé de SPUC , mais la description revendique des types de données à virgule fixe et certaines fonctions mathématiques.


J'ai utilisé 'extern' C "'avant pour les fichiers DLL (bibliothèque de liens dynamiques) pour faire etc. main () fonction" exportable "afin qu'il puisse être utilisé plus tard dans un autre exécutable à partir de DLL. Peut-être qu'un exemple d'où je l'ai utilisé peut être utile.

DLL

#include <string.h>
#include <windows.h>

using namespace std;

#define DLL extern "C" __declspec(dllexport)
//I defined DLL for dllexport function
DLL main ()
{
    MessageBox(NULL,"Hi from DLL","DLL",MB_OK);
}

EXE

#include <string.h>
#include <windows.h>

using namespace std;

typedef LPVOID (WINAPI*Function)();//make a placeholder for function from dll
Function mainDLLFunc;//make a variable for function placeholder

int main()
{
    char winDir[MAX_PATH];//will hold path of above dll
    GetCurrentDirectory(sizeof(winDir),winDir);//dll is in same dir as exe
    strcat(winDir,"\\exmple.dll");//concentrate dll name with path
    HINSTANCE DLL = LoadLibrary(winDir);//load example dll
    if(DLL==NULL)
    {
        FreeLibrary((HMODULE)DLL);//if load fails exit
        return 0;
    }
    mainDLLFunc=(Function)GetProcAddress((HMODULE)DLL, "main");
    //defined variable is used to assign a function from dll
    //GetProcAddress is used to locate function with pre defined extern name "DLL"
    //and matcing function name
    if(mainDLLFunc==NULL)
    {
        FreeLibrary((HMODULE)DLL);//if it fails exit
        return 0;
    }
    mainDLLFunc();//run exported function 
    FreeLibrary((HMODULE)DLL);
}




c++ math fixed-point